Android 开发中fragment预加载问题
发布时间 - 2026-01-10 22:22:40 点击率:次我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。这样的结果,我们当然不会满意。那么,能不能做到当切换到这个fragment的时候,它才去初始化呢?

答案就在Fragment里的setUserVisibleHint这个方法里。请看关于Fragment里这个方法的API文档(国内镜像地址:http://zdz.la/YrpKlu):
Set a hint to the system about whether this fragment's UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore. An app may set this to false to indicate that the fragment's UI is scrolled out of visibility or is otherwise not directly visible to the user. This may be used by the system to prioritize operations such as fragment lifecycle updates or loader ordering behavior. Parameters isVisibleToUser true if this fragment's UI is currently visible to the user (default), false if it is not.
该方法用于告诉系统,这个Fragment的UI是否是可见的。所以我们只需要继承Fragment并重写该方法,即可实现在fragment可见时才进行数据加载操作,即Fragment的懒加载。
代码如下:
/*
* Date: 14-7-17
* Project: Access-Control-V2
*/
package cn.irains.access_control_v2.common;
import android.support.v4.app.Fragment;
/**
* Author: msdx (645079761@qq.com)
* Time: 14-7-17 下午5:46
*/
public abstract class LazyFragment extends Fragment {
protected boolean isVisible;
/**
* 在这里实现Fragment数据的缓加载.
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
protected void onVisible(){
lazyLoad();
}
protected abstract void lazyLoad();
protected void onInvisible(){}
}
在LazyFragment,我增加了三个方法,一个是onVisiable,即fragment被设置为可见时调用,一个是onInvisible,即fragment被设置为不可见时调用。另外再写了一个lazyLoad的抽象方法,该方法在onVisible里面调用。你可能会想,为什么不在getUserVisibleHint里面就直接调用呢?
我这么写是为了代码的复用。因为在fragment中,我们还需要创建视图(onCreateView()方法),可能还需要在它不可见时就进行其他小量的初始化操作(比如初始化需要通过AIDL调用的远程服务)等。而setUserVisibleHint是在onCreateView之前调用的,那么在视图未初始化的时候,在lazyLoad当中就使用的话,就会有空指针的异常。而把lazyLoad抽离成一个方法,那么它的子类就可以这样做:
public class OpenResultFragment extends LazyFragment{
// 标志位,标志已经初始化完成。
private boolean isPrepared;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d(LOG_TAG, "onCreateView");
View view = inflater.inflate(R.layout.fragment_open_result, container, false);
//XXX初始化view的各控件
isPrepared = true;
lazyLoad();
return view;
}
@Override
protected void lazyLoad() {
if(!isPrepared || !isVisible) {
return;
}
//填充各控件的数据
}
}
在上面的类当中,我们增加了一个标志位isPrepared,用于标志是否初始化完成。然后在我们所需要的初始化操作完成之后调用,如上面的例子当中,在初始化view之后,设置 isPrepared为true,同时调用lazyLoad()方法。而在lazyLoad()当中,判断isPrepared和isVisible只要有一个不为true就不往下执行。也就是仅当初始化完成,并且可见的时候才继续加载,这样的避免了未初始化完成就使用而带来的问题。
在这里我对fragment的懒加载实现的介绍就到此为止,如果你有兴趣,可以基于此再深入探究,比如写一个带有缓初始化和可见时刷新的特性的Fragment。
以上所述是小编给大家介绍的Android 开发中fragment预加载问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
# fragment
# 预加载
# Android开发RecyclerView性能优化之异步预加载
# android非RxJava环境下使用Handler实现预加载
# android使用RxJava实现预加载
# android 预加载进程的实现方法
# 加载
# 在这里
# 设置为
# 小编
# 增加了
# 就会
# 如果你
# 是在
# 就在
# 在这个
# 多个
# 子类
# 就不
# 我对
# 而在
# 要在
# 这样做
# 给大家
# 有兴趣
# 或其他
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Python并发异常传播_错误处理解析【教程】
Linux后台任务运行方法_nohup与&使用技巧【技巧】
再谈Python中的字符串与字符编码(推荐)
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
详解阿里云nginx服务器多站点的配置
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
php485函数参数是什么意思_php485各参数详细说明【介绍】
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
Laravel如何实现数据库事务?(DB Facade示例)
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
佛山网站制作系统,佛山企业变更地址网上办理步骤?
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
进行网站优化必须要坚持的四大原则
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
iOS UIView常见属性方法小结
大连 网站制作,大连天途有线官网?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
如何用美橙互联一键搭建多站合一网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
如何构建满足综合性能需求的优质建站方案?
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Laravel如何自定义错误页面(404, 500)?(代码示例)
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
,南京靠谱的征婚网站?
大同网页,大同瑞慈医院官网?
linux写shell需要注意的问题(必看)
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
昵图网官方站入口 昵图网素材图库官网入口

