AndroidX对ViewPager懒加载的影响及解决方案

可以看到初始化的方式添加了一个@Deprecated (废弃)的注解,就是告诉大家不要用这种方式进行初始化了。那么应该怎么进行初始化呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里就可以看到,初始化的时候,除了需要传入fm,同时还需要传一个behavior,让我们来看看Behavior具体是哪些值?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据注释可以知道

当behavior == BEHAVIOR_SET_USER_VISIBLE_HINT 时,Fragment切换时,会触发setUserVisibleHint。
这个效果和[图片上传失败…(image-498b78-1587693534449)]

的效果一样,也就是说,如果你不想修改原来懒加载的逻辑,只需要这么写

FragmentPagerAdapter adapter = new FragmentPagerAdapter(fm);
或者
FragmentPagerAdapter adapter = new FragmentPagerAdapter(fm, BEHAVIOR_SET_USER_VISIBLE_HINT);

但是,我们看到了BEHAVIOR_SET_USER_VISIBLE_HINT也被标识了@Deprecated (废弃),建议我们使用BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT。所以[图片上传失败…(image-7fe658-1587693534449)]

初始化方式是:

FragmentPagerAdapter adapter = new FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);

而这时候会用到生命周期状态标识Lifecycle.State。

2 FragmentPageAdapter初始化Fragment

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
//…省略非重点代码
if (mBehavior == BEHAVIOR_SET_USER_VISIBLE_HINT) {
//旧版本,触发setUserVisibleHint
fragment.setUserVisibleHint(false);
}

mFragments.set(position, fragment);
//关键句,添加Fragment进入事物list
mCurTransaction.add(container.getId(), fragment);

if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
//AndroidX,设置初始化执行到onStart()就停止了
mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.STARTED);
}

return fragment;
}

追踪进入mCurTransaction.add(container.getId(), fragment);方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

void doAddOp(int containerViewId, Fragment fragment, @Nullable String tag, int opcmd) {
//…省略非重点代码
addOp(new Op(opcmd, fragment));
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

添加的是一个Op对象,看看Op是如何初始化的。

Op(int cmd, Fragment fragment) {
this.mCmd = cmd;
this.mFragment = fragment;
//初始化执行到onResume()
this.mOldMaxState = Lifecycle.State.RESUMED;
this.mCurrentMaxState = Lifecycle.State.RESUMED;
}

到这里,我们就能明白了如果是旧版本,Fragment初始化的时候,默认会执行到onResume(),而AndroidX只会执行到onStart(),所以我们迁移到AndroidX之后,不需要全都依靠setUserVisibleHint()来判断当前页面是否显示,我们可以根据onResume()来判断。

3 迁移到AndroidX之后,BaseFragment相应的修改

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mRoot = inflater.inflate(getLayoutId(), container, false);
Log.d(getLifeCycleTag(), “onCreateView”);
initView(mRoot);
//在View创建完毕之后,isViewCreate 要变为true
isViewCreated = true;
//下面2段代码可以删除
//if (!isHidden() && getUserVisibleHint())
//dispatchVisibleState(true);
return mRoot;
}

@Override
public void onResume() {
super.onResume();
Log.d(getLifeCycleTag(), “onResume”);
/* 旧版本
if (!isFirstVisible) {
if (!isHidden() && !currentVisibleState && getUserVisibleHint())
dispatchVisibleState(true);
}
*/
//新版本
if (!isHidden() && !currentVisibleState && isResumed()) {
dispatchVisibleState(true);
}
}

@Override
public void onPause() {
MobclickAgent.onPageEnd(this.getClass().getName());
super.onPause();
Log.d(tag,"onPause: ");
/* 旧版本

写在最后

本次我的分享也接近尾声了,感谢你们在百忙中花上一下午来这里聆听我的宣讲,希望在接下来的日子,我们共同成长,一起进步!!!

最后放上一个大概的Android学习方向及思路(详细的内容太多了~),提供给大家:

对于程序员来说,要学习的知识内容、技术有太多太多,这里就先放上一部分,其他的内容有机会在后面的文章向大家呈现出来,不过我自己所有的学习资料都整理成了一个文档,一直在不断学习,希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

Android架构师之路很漫长,一起共勉吧!

如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
足,谢谢。

[外链图片转存中…(img-ILn3Tp83-1714469093583)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值