Android - Fragment正确使用方法介绍,setUserVisibleHint方法实现数据懒加载

我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个fragment的时候,它才去初始化呢?

答案就在Fragment里的setUserVisibleHint这个方法里。

import android.support.v4.app.Fragment;

/**
 * @Title: BaseFragment.java 
 * @Package com.ibanglife.fragment 
 * @Description: TODO 博客:http://www.cnblogs.com/brantliu/
 * @author Brant Liu  lbf1988@qq.com
 * @date 2015-11-2 下午2:56:22 
 * @version V1.0 
 */
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();
        }
	}
	protected void onVisible(){
        lazyLoad();
    }
    protected abstract void lazyLoad();
    protected void onInvisible(){}
}

  在BaseFragment,我增加了三个方法,一个是onVisiable,即fragment被设置为可见时调用,一个是onInvisible,即fragment被设置为不可见时调用。另外再写了一个lazyLoad的抽象方法,该方法在onVisible里面调用。你可能会想,为什么不在getUserVisibleHint里面就直接调用呢?

  这么写是为了代码的复用。因为在fragment中,我们还需要创建视图(onCreateView()方法),可能还需要在它不可见时就进行其他小量的初始化操作(比如初始化需要通过AIDL调用的远程服务)等。而setUserVisibleHint是在onCreateView之前调用的,那么在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常。而把lazyLoad抽离成一个方法,那么它的子类就可以这样做:

public class ContentFragment extends BaseFragment{
    // 标志位,标志已经初始化完成。
    private boolean isPrepared;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_open_result, container, false);
    //XXX初始化view的各控件
    isPrepared = true;
    lazyLoad();
    return view;
    }
    @Override
    protected void lazyLoad() {
        if(!isPrepared || !isVisible) {
            return;
        }
        //填充各控件的数据
    }
}

  

posted @ 2015-11-03 08:08  偷着乐  阅读(5404)  评论(0编辑  收藏  举报