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方法,会保存所有的状态。
相关文章推荐
- BaseFragment 解决ViewPager预加载问题
- Android 封装Fragment-BaseLazyFragment(懒加载)
- 关于Activity加载Fragment切换Show和Hide重叠问题
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- 关于ViewPager中Fragment的延时加载问题
- Android ListView异步加载图片乱序问题,原因分析及解决方案
- Android中Activity和Fragment之间数据传递(例子中也有事务加载Fragment)
- 读书笔记--Activity的生命周期、加载模式,以及Fragment
- 在主Android Activity中加载Fragment的一般简易方法 ,来模拟一个微信界面。
- Fragment和Activity跳转的问题
- Android中Fragment多层嵌套时onActivityResult无法正确回调问题的解决方法
- 使用Activity动态加载Fragment实现主界面框架
- 解决延迟加载的问题 lazy=“false”
- Flex中采用主SWF文件加载子SWF文件中添加了Chart后,导致at mx.charts.chartClasses::ChartBase/initStyles()异常的问题解决方法
- 当一个Activity加多个Fragment的时候,点击导航返回按钮无效或者点击back键就把Activity关闭了的问题
- Android ViewPager的FragmentPagerAdapter中Fragment不重新加载数据,并且使用的是其他缓存的Framgnet的问题
- listview中alertdialog弹窗问题(activity ,fragment)
- 在Spring整合 SpringMVC,SpringData和 JPA 时,如何解决 Lazy懒加载问题?
- 关于Spring+MyBatis的MapperScannerConfigurer无法加载place-holder属性问题分析
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案