最近被viewpager套fragment加载100+图文数据搞得头大。三个类似的fragment 由于viewpager的预加载导致个别机型oom。一个Fragment里有两个关联的列表,数据来自数据库和网络。然后三个一样的Fragment几乎同时oncreateview ,然后onresume等。查阅了很多网上的资料,终于找到解决的办法。
1. 由于是图文结合,虽然图不大,但是返回数据没有分页功能,所以需要控制滑动时不能加载图片。同时,在页面不可见或者低内存的时候glide释放。
//activity
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
GlideUtils.onTrimMemory(this, level)
}
//fragment
override fun onLowMemory() {
super.onLowMemory()
GlideUtils.onLowMemory(activity)
}
2. viewpager 缓存页面个数的问题,最多不超过4个,建议2个就OK
viewPager.offscreenPageLimit = 2
3. FragmentPagerAdapter 或者FragmentStatePagerAdapter 里的destroyItem方法的super那句去掉
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
}
4. lazyFragment 终极利器
import android.os.Bundle
abstract class LazyLoadFragment : BaseFragment() {
private var isViewCreated = false// 界面是否已创建完成 = false
private var isVisibleToUser = false // 是否对用户可见 = false
private var isDataLoaded = false// 数据是否已请求, isNeedReload()返回false的时起作用 = false
// 实现具体的数据请求逻辑
protected abstract fun loadData()
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
this.isVisibleToUser = isVisibleToUser
tryLoadData()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
isViewCreated = true
tryLoadData()
}
/**
* ViewPager场景下,判断父fragment是否可见
*
* @return
*/
private val isParentVisible: Boolean
private get() {
val fragment = parentFragment
return fragment == null || fragment is LazyLoadFragment && fragment.isVisibleToUser
}
/**
* ViewPager场景下,当前fragment可见,如果其子fragment也可见,则尝试让子fragment请求数据
*/
private fun dispatchParentVisibleState() {
val fragmentManager = childFragmentManager
val fragments = fragmentManager.fragments
if (fragments.isEmpty()) {
return
}
for (child in fragments) {
if (child is LazyLoadFragment && child.isVisibleToUser) {
child.tryLoadData()
}
}
}
fun tryLoadData() {
if (isViewCreated &&
isVisibleToUser &&
isParentVisible &&
!isDataLoaded) {
loadData()
isDataLoaded = true // 通知 子 Fragment 请求数据
dispatchParentVisibleState()
}
}
}
参考链接:
http://www.imooc.com/article/281422
https://blog.csdn.net/syusikoku/article/details/52304321
https://blog.csdn.net/paladinzh/article/details/88078989
网友评论