美文网首页
Android viewpager + fragment 懒加载

Android viewpager + fragment 懒加载

作者: 钢镚koala | 来源:发表于2020-04-03 17:37 被阅读0次

最近被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

相关文章

网友评论

      本文标题:Android viewpager + fragment 懒加载

      本文链接:https://www.haomeiwen.com/subject/dadkphtx.html