目录
你是否遇到过Fragment切换时的卡顿和白屏?想要实现丝滑的页面切换效果吗?本文将带你全面掌握Fragment预加载机制,彻底告别页面加载等待!
一、为什么需要预加载?
在日常开发中,当我们切换到新的Fragment时,通常会经历以下步骤:
// 传统的Fragment加载过程
1. 创建实例 -> new MyFragment()
2. 生命周期 -> onAttach() -> onCreate() -> onCreateView() -> onViewCreated()
3. 数据加载 -> 在onCreateView()或onViewCreated()中发起网络请求
问题所在:这个过程是同步且串行的。用户会先看到一个空白的页面框架,然后等待数据加载,体验非常差!
预加载的核心思想:提前完成Fragment的创建、视图初始化和数据加载,当用户真正需要显示时,内容已经准备就绪,实现无缝切换。
二、ViewPager/ViewPager2的预加载机制
2.1 内置预加载机制
ViewPager 默认会预加载当前页面相邻的页面:
// 默认设置 - 预加载相邻1个页面
viewPager.setOffscreenPageLimit(1); // 默认值就是1,不能设为0
// ViewPager2的配置方式
viewPager2.setOffscreenPageLimit(1);
工作机制:
- 当前在第1页时,第0页和第2页已经执行到
onResume() - 视图已经创建完成,但可能不可见
2.2 预加载引发的问题和解决方案
虽然预加载提升了切换流畅度,但也带来了问题:
- 不必要的资源消耗:预加载的Fragment可能永远不会被看到
- 数据请求浪费:所有预加载Fragment都会发起数据请求
解决方案:懒加载(Lazy Load)
2.3 现代懒加载实现方案(推荐)
废弃方法:setUserVisibleHint(boolean) 已过时
推荐方案:结合ViewPager2和生命周期控制
class NewsFragment : Fragment() {
private var isDataLoaded = false
private var isViewCreated = false
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
isViewCreated = true
tryLoadData()
}
override fun onResume() {
super.onResume()
// 在ViewPager2中,只有当前页面会进入RESUMED状态
tryLoadData()
}
private fun tryLoadData() {
if (isViewCreated && !isDataLoaded) {
loadData()
isDataLoaded = true
}
}
private fun loadData() {
// 实际的数据加载逻辑
viewModel.fetchNews().observe(v

最低0.47元/天 解锁文章
900

被折叠的 条评论
为什么被折叠?



