代码改变世界

多个fragment之间切换加载数据卡顿

2016-08-22 11:26  百度乜搜不到  阅读(1198)  评论(0编辑  收藏  举报

Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。有可能会导致卡顿。

就需要用到Fragment里的setUserVisibleHint这个方法里。

解决办法

 

package com.xgs.panku.ui;

import android.app.Fragment;

/**
* 类描述:当切换到这个fragment的时候初始化控件
* 作者:@zyx
* 时间:2016/8/22 11:10
* 邮箱:zhangyuanxiao@monster-tld.com
*/
public abstract class BaseFragment extends Fragment{
//判断是否显示
protected boolean isVisible;

/**
* 在这里实现Fragment数据的缓加载.
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()){
isVisible = true;
//加载数据
onVisible();
}else{
isVisible = false;
onInvisible();
}
}

/**
* fragment被设置为可见时调用
*/
protected void onVisible(){
isLoading();
}
/**
* fragment被设置为不可见时调用
*/
protected void onInvisible(){}
//获取数据的抽象方法
protected abstract void isLoading();
}
调用方式:
  1.  // 判断是否加载
  2.     private boolean isPrepared;  
  3.   
  4.     @Override  
  5.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  6.         Log.d(LOG_TAG, "onCreateView");  
  7.         View view = inflater.inflate(R.layout.fragment_open_result, container, false);  
  8.         //XXX初始化view的各控件  
  9.       isPrepared = true;  
  10.         lazyLoad();  
  11.         return view;  
  12.     }  
  13.   
  14.     @Override  
  15.     protected void isLoading() {  
  16.         if(!isPrepared || !isVisible) {  
  17.             return;  
  18.         }  
  19.         //填充各控件的数据  
  20.     }