BaseActivity,LazyBaseFragment懒加载问题分析

compile

    implementation 'com.android.support:support-v4:26.1.0'
    //    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
    compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
    compile 'io.reactivex.rxjava2:rxjava:2.1.8'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    //okhttp log 工具
    compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
    compile 'com.google.code.gson:gson:2.8.2'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
    compile 'com.google.dagger:dagger:2.12'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
    //适配的终极解决方案
    compile 'com.zhy:autolayout:1.4.5'
    // If you want to bind to Android-specific lifecycles
    compile 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
    // If you want pre-written Activities and Fragments you can subclass as providers
    compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'
    implementation 'com.android.support:cardview-v7:26.1.0'

    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

    compile 'org.greenrobot:eventbus:3.1.1'

BaseActivity

public abstract class BaseActivity extends RxAppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        init(savedInstanceState);
    }

    protected abstract void init(Bundle savedInstanceState);

    protected abstract @LayoutRes int getLayoutId();
}

LazyBaseFragment

/**
 * Created by PVer on 2018/3/24.
 */

public abstract class LazyBaseFragment extends RxFragment{

    protected boolean isFirstUserVisible = true;
    protected boolean isPrepared = false;
    private View targetView;
    private boolean isFirstUserInVisible = true;
    protected String TAG = "LazyBaseFragment";


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        if (getLayoutId() != 0) {
            return inflater.inflate(getLayoutId(), container,false);
        } else {
            return super.onCreateView(inflater, container, savedInstanceState);
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initViewAndEvent(view,savedInstanceState);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initPrepare();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        Log.v(TAG,"setUserVisibleHint:" + String.valueOf(isVisibleToUser));

        if(isVisibleToUser)
        {
            //可见
            if(isFirstUserVisible)
            {
                //第一次用户可见
                isFirstUserVisible = false;
                initPrepare();
            }
            else
            {
                onUserVisible();
            }
        }
        else
        {
            //不可见
            if(isFirstUserInVisible)
            {
                isFirstUserInVisible = false;
                onFirstUserInvisible();
            }
            else
            {
                onUserInvisible();
            }
        }
    }


    private synchronized void initPrepare() {
        if (isPrepared) {
            onFirstUserVisible();
        } else {
            isPrepared = true;
        }
    }

    public View getTargetView() {
        return targetView;
    }

    public void setTargetView(View targetView) {
        this.targetView = targetView;
    }

    protected abstract @LayoutRes int getLayoutId();

    protected abstract void onFirstUserVisible();  //第一次用户可见

    protected abstract void onUserVisible();

    private void onFirstUserInvisible(){}

    protected abstract void onUserInvisible();

    protected abstract void initViewAndEvent(View view,Bundle savedInstanceState);
}

对于LazyBaseFragment的说明

假设有四个界面,第一个界面为Home,第二个为Exchange,第三个为Treat,第四个为Mine。 他们的生命周期调用:

1. Adapter 继承的是FragmentStatePagerAdapter :

03-24 23:51:54.981 18649-18649/com.fai.tools V/HomeFragment: setUserVisibleHint:false
03-24 23:51:54.981 18649-18649/com.fai.tools V/ExchangeFragment: setUserVisibleHint:false
03-24 23:51:54.981 18649-18649/com.fai.tools V/HomeFragment: setUserVisibleHint:true
03-24 23:51:54.987 18649-18649/com.fai.tools V/HomeFragment: onCreateView
03-24 23:51:55.001 18649-18649/com.fai.tools V/HomeFragment: onActivityCreated
03-24 23:51:55.001 18649-18649/com.fai.tools V/ExchangeFragment: onCreateView
03-24 23:51:55.018 18649-18649/com.fai.tools V/ExchangeFragment: onActivityCreated

继续滑动一下ViewPager到ExchangeFragment:

03-24 23:57:37.090 18649-18649/com.fai.tools V/TreatFragment: setUserVisibleHint:false
03-24 23:57:37.091 18649-18649/com.fai.tools V/HomeFragment: setUserVisibleHint:false
03-24 23:57:37.091 18649-18649/com.fai.tools V/ExchangeFragment: setUserVisibleHint:true
03-24 23:57:37.095 18649-18649/com.fai.tools V/TreatFragment: onCreateView
03-24 23:57:37.132 18649-18649/com.fai.tools V/TreatFragment: onActivityCreated

继续滑动一下ViewPager到TreatFragment:

03-25 11:20:59.987 22856-22856/com.fai.tools V/MineFragment: setUserVisibleHint:false
03-25 11:20:59.987 22856-22856/com.fai.tools V/ExchangeFragment: setUserVisibleHint:false
03-25 11:20:59.987 22856-22856/com.fai.tools V/TreatFragment: setUserVisibleHint:true
03-25 11:20:59.989 22856-22856/com.fai.tools V/HomeFragment: onPause
03-25 11:20:59.989 22856-22856/com.fai.tools V/HomeFragment: onStop
03-25 11:20:59.991 22856-22856/com.fai.tools V/HomeFragment: onDestroy
03-25 11:20:59.992 22856-22856/com.fai.tools V/MineFragment: onCreateView
03-25 11:21:00.010 22856-22856/com.fai.tools V/MineFragment: onActivityCreated

继续滑动一下ViewPager到MineFragment:

03-25 11:22:25.521 22856-22856/com.fai.tools V/TreatFragment: setUserVisibleHint:false
03-25 11:22:25.521 22856-22856/com.fai.tools V/MineFragment: setUserVisibleHint:true
03-25 11:22:25.524 22856-22856/com.fai.tools V/ExchangeFragment: onPause
03-25 11:22:25.524 22856-22856/com.fai.tools V/ExchangeFragment: onStop
03-25 11:22:25.526 22856-22856/com.fai.tools V/ExchangeFragment: onDestroy

2.若增加代码:

viewPager.setOffscreenPageLimit(pagerLimit);  

//这句话的代码的作用就是在一开始ViewPager就缓存pagerLimit + 1个页面, 不管是FragmentPagerStateAdapter还是FragmentPagerAdapter都是一样的缓存模式,一开始就缓存,pagerLimit + 1个页面,log一样 。
// 虽然FragmentPagerAdapter已经会缓存所有加载过的页面,他的缓存和viewPager.setOffscreenPageLimit(pagerLimit);区别在于 
// 1. FragmentPagerAdapter不是一开始就缓存pagerLimit + 1  ,是加载一个缓存一个,都缓存下来
// 2.FragmentPagerAdapter会将加载过的暂时用不到的fragment进行onPause onStop操作,比如在第三个页面的时候,会将第一个页面进行onPause , onStop操作
04-22 17:07:47.110 5114-5114/com.fai.tools V/HomeFragment: setUserVisibleHint:false
04-22 17:07:47.110 5114-5114/com.fai.tools V/ExchangeFragment: setUserVisibleHint:false
04-22 17:07:47.110 5114-5114/com.fai.tools V/TreatFragment: setUserVisibleHint:false
04-22 17:07:47.110 5114-5114/com.fai.tools V/MineFragment: setUserVisibleHint:false
04-22 17:07:47.110 5114-5114/com.fai.tools V/HomeFragment: setUserVisibleHint:true

04-22 17:07:47.114 5114-5114/com.fai.tools V/HomeFragment: onCreateView
04-22 17:07:47.138 5114-5114/com.fai.tools V/HomeFragment: onActivityCreated
04-22 17:07:47.138 5114-5114/com.fai.tools V/ExchangeFragment: onCreateView
04-22 17:07:47.142 5114-5114/com.fai.tools V/ExchangeFragment: onActivityCreated
04-22 17:07:47.142 5114-5114/com.fai.tools V/TreatFragment: onCreateView
04-22 17:07:47.146 5114-5114/com.fai.tools V/TreatFragment: onActivityCreated
04-22 17:07:47.146 5114-5114/com.fai.tools V/MineFragment: onCreateView
04-22 17:07:47.149 5114-5114/com.fai.tools V/MineFragment: onActivityCreated

继续滑动到下一个页面 ExchangeFragment

04-22 17:12:59.569 5114-5114/com.fai.tools V/HomeFragment: setUserVisibleHint:false
04-22 17:12:59.569 5114-5114/com.fai.tools V/ExchangeFragment: setUserVisibleHint:true

继续滑动到下一个页面 TreatFragment

04-22 17:14:27.757 5114-5114/com.fai.tools V/ExchangeFragment: setUserVisibleHint:false
04-22 17:14:27.757 5114-5114/com.fai.tools V/TreatFragment: setUserVisibleHint:true

继续滑动到下一个页面MineFragment

04-22 17:15:23.909 5114-5114/com.fai.tools V/TreatFragment: setUserVisibleHint:false
04-22 17:15:23.909 5114-5114/com.fai.tools V/MineFragment: setUserVisibleHint:true

3.Adapter 继承的是FragmentPagerAdapter :

03-25 11:07:57.600 18382-18382/com.fai.tools V/HomeFragment: setUserVisibleHint:false
03-25 11:07:57.600 18382-18382/com.fai.tools V/ExchangeFragment: setUserVisibleHint:false
03-25 11:07:57.600 18382-18382/com.fai.tools V/HomeFragment: setUserVisibleHint:true
03-25 11:07:57.604 18382-18382/com.fai.tools V/HomeFragment: onCreateView
03-25 11:07:57.609 18382-18382/com.fai.tools V/HomeFragment: onActivityCreated
03-25 11:07:57.610 18382-18382/com.fai.tools V/ExchangeFragment: onCreateView
03-25 11:07:57.614 18382-18382/com.fai.tools V/ExchangeFragment: onActivityCreated

继续滑动到下一个页面ExchangeFragment:

03-25 11:08:32.784 18382-18382/com.fai.tools V/TreatFragment: setUserVisibleHint:false
03-25 11:08:32.784 18382-18382/com.fai.tools V/HomeFragment: setUserVisibleHint:false
03-25 11:08:32.784 18382-18382/com.fai.tools V/ExchangeFragment: setUserVisibleHint:true
03-25 11:08:32.787 18382-18382/com.fai.tools V/TreatFragment: onCreateView
03-25 11:08:32.805 18382-18382/com.fai.tools V/TreatFragment: onActivityCreated

继续滑动一下ViewPager到TreatFragment:

03-25 11:08:52.785 18382-18382/com.fai.tools V/MineFragment: setUserVisibleHint:false
03-25 11:08:52.785 18382-18382/com.fai.tools V/ExchangeFragment: setUserVisibleHint:false
03-25 11:08:52.785 18382-18382/com.fai.tools V/TreatFragment: setUserVisibleHint:true
03-25 11:08:52.788 18382-18382/com.fai.tools V/HomeFragment: onPause
03-25 11:08:52.788 18382-18382/com.fai.tools V/HomeFragment: onStop
03-25 11:08:52.791 18382-18382/com.fai.tools V/MineFragment: onCreateView
03-25 11:08:52.806 18382-18382/com.fai.tools V/MineFragment: onActivityCreated

继续滑动一下ViewPager到MineFragment:

03-25 11:09:13.006 18382-18382/com.fai.tools V/TreatFragment: setUserVisibleHint:false
03-25 11:09:13.006 18382-18382/com.fai.tools V/MineFragment: setUserVisibleHint:true
03-25 11:09:13.008 18382-18382/com.fai.tools V/ExchangeFragment: onPause
03-25 11:09:13.008 18382-18382/com.fai.tools V/ExchangeFragment: onStop

FragmentStatePagerAdapter和FragmentPagerAdapter的区别:

FragmentStatePagerAdapter不会保存所有Pager的状态,最多保存上一个,自己,下一个。其他的都会执行onDestroy方法

FragmentPagerAdapter不会执行onDestroy方法,会保存所有的状态。

猜你喜欢

转载自my.oschina.net/u/3246345/blog/1649976