您的位置:首页 > 其它

BaseActivity,LazyBaseFragment懒加载问题分析

2018-03-23 17:08 453 查看

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方法,会保存所有的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐