Android ViewPager & Fragment 懒加载深度剖析

在Android中 除了四大组件经常使用(四大组件通信的基础桥梁是Intent)

其实还有一个也是被经常使用 那就是Fragment(比如动态替换,实现多Tab不通效果等)

先说一下Fragment生命周期:

ViewPage 常用的Adapter有 PageAdapter,PageStateAdapter,一般都是复写

getItem  
getCount

destoryView

getTitle等

ViewPager有默认缓存机制,缓存两个 比如当前是第二个Fragment 那么第一个和第三个就会被加载,这样如果有网络请求或者有一大堆初始化view findViewById等操作的话体验不是太好,那么解决方法有个setUserVisiab 但是这个被系统调用不一定是什么时机,但是只要视图可见了就会被调用,有可能会被调用两次,那么 我们根据Fragment生命周期,写两个变量,控制视图何时加载数据等操作,从而实现懒加载

setUserVisibleHint是在onCreateView周期前调用

private boolean isViewCreate ; 视图是否被创建

当执行了onCreateView 然后在返回View之前将其变量设置为true;

private boolean isUserVisiable; 是否可见了

当setUserVisibleHint (boolean isVisibleToUser)

方法执行了 并且isVisibleToUser为true,那么将isUserVisiable 设置为true;

然后执行方法 判断这两个变量都是否为true,如果是就加载

if (isInitView && isVisiable)
{
    lazyData();
    isVisiable = false;
    isInitView = false;
}

完整代码:

package com.android.angola.wenna.plus.base;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * 懒加载的Fragment 提高效率
 * @author 643200732
 * */
public abstract class BaseLazyFragment extends Fragment {

    public Context context;
    public View rootView;
    private boolean isInitView = false;
    private boolean isVisiable = false;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (rootView == null)
        {
            rootView = inflater.inflate(setLayoutId(),container,false);
        }
        initView(rootView);

        isInitView = true;
        isCanLoadData();
        return rootView;
    }

    private void isCanLoadData() {
        if (isInitView && isVisiable)
        {
            lazyData();
            isVisiable = false;
            isInitView = false;
        }
    }

    protected abstract void lazyData();


    protected abstract void initView(View rootView);

    protected abstract int setLayoutId();

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser)
        {
            isVisiable = true;
            isCanLoadData();
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isVisiable = false;
    }
}

发布了42 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_29769851/article/details/90712756