Android系列Viewpager+Fragment 优化之懒加载(预加载)的实现

今天项目中有个页面就是用的viewpager+fragment ,我正好入职看到了有些缺陷没有做懒加载,所以就把代码优化了一下,在这里正好做个记录

首先关于viewpage+fragmentr的实现方式网上和实际项目中都有很多demo和示例使用,我在这篇文章中就不多阐述,不明白怎么使用的同学可以先去了解下这种结合使用方式,再来了解这篇文章的优化方式 好了 废话不多说 直接开干!!!

懒加载(预加载)

懒加载字面意思就是当需要的时候才会去加载,不需要就不要加载

为什么Fragment需要懒加载呢,一般我们都会在onCreate()或者onCreateView()里去启动一些数据加载操作,比如从本地加载或者从服务器加载。大部分情况下,这样并不会出现什么问题,但是当你使用ViewPager + Fragment的时候,问题就来了,这时就应该考虑是否需要实现懒加载了。

优点

1.支持数据的懒加载并且只加载一次

2.提供 Fragment 可见与不可见时回调,支持你在这里进行一些 ui 操作,如显示/隐藏加载框

3.支持 view 的复用,防止与 ViewPager 使用时出现重复创建 view 的问题

示例

我们知道viewpager加fragment的组合是很多app展示的方式,我们以加载四个fragment为例,默认viewpager中,首次进来就会初始化2个fragment,通过调用方法,甚至可以在首次进来的时候能一次性初始化四个fragment,我们知道很多页面的网络请求都在fragment中初始化的时候就开始了,所以如果不需要打开的页面也会去进行网络加载,无疑会造成用户体验不好,今天这篇博客带来的就是怎么去实现懒加载,在用户滑到这个fragment的时候再去初始化fragment。

我们一般会抽取一个BaseFragment去作为基类,在这个基类中进行一系列的代码书写 去判断当前fragment是不是首次加载 先上代码

那么如何使用呢?

在需要继承的子类中 重写  onFragmentFirstVisible() 方法 然后在这个方法中进行网络请求 数据的加载 或者其他一些初始化工作 这样就能实现Fragment的懒加载

原理

要实现懒加载 必须需要了解一个方法

setUserVisibleHint(boolean isVisibleToUser) 

当你去网上查找相关资料时,你会发现很多人推荐说把加载数据的操作放在这个函数里,isVisibleToUser表示当前Fragment是否可见。那么,是否真的可以就这样做呢?我们看个日志:

那么,是否可以在setUserVisibleHint(boolean isVisibleToUser)里进行数据加载操作来实现懒加载呢?

可以是可以,如果你只是需要数据的懒加载的话,但如果你还有以下的需求,那么这种方式就不行了:

1、如果你在Fragment可见时需要进行一些控件的操作,比如显示加载控件

2、如果你还需要在Fragment从 “可见 -> 不可见” 时进行一些操作的话,比如取消加载控件显示

注意:setUserVisibleHint()可能会在Fragment的生命周期之外被调用,也就是可能在view创建前就被调用,也可能在destroyView后被调用,所以如果涉及到一些控件的操作的话,可能会报 null 异常,因为控件还没初始化,或者已经摧毁了。

注意:

如果想要让 fragment 的布局复用成功,需要重写 viewpager 的适配器里的 destroyItem() 方法,将 super 去掉,也就是不销毁 view。

如果出现切换回来或不相邻的Tab切换时导致空白界面的问题,解决方法:在 onCreateView中复用布局 + ViewPager 的适配器中复写 destroyItem() 方法去掉 super。

猜你喜欢

转载自blog.csdn.net/lixiaolu1994/article/details/83539353