Android多个fragment懒加载的坑(卡顿)

2023-10-31

在Android开发中,有很多种情况都是viewpage+fragment左右滑动进行布局的,例如下面的今日头条
在这里插入图片描述
在今日头条app上,我们可以看到,其顶部都是一栏的类型数据源,可滑动,可联动下面的viewpage里的fragment,但是很多时候,viewpage+fragment中的fragment每次都将走onCreate方法,导致在视觉上造车一定的卡顿,而且在加载当前fragment的时候,往往会预加载下一个fragment的数据,造成视觉上的误解。

思路:

在尝试过很多方法之后,终于找到了一个比较好的解决方法。使用Fragment自带的setUserVisibleHint()来判断当前fragment是否对用户可见,根据回调的isVisibleToUser参数来进行相关的逻辑判断。创建一个变量isVisible来拿到fragment是否可见的标志。

但是直接根据isVisible判断就加载数据,很有可能很多控件在OnCreateView()方法还未执行完成的情况下出现NullPointerException空指针的情况。所以我们需要在控件初始化完成并且用户可见的时候,再去进行数据的加载。

在这里插入图片描述

最后集成一个通用的LazyloadFragment实现懒加载的fragment

public abstract class LazyloadFragment extends Fragment {
    protected View rootView;
    private boolean isInitView = false;
    private boolean isVisible = false;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(setContentView(), container, false);
        init();
        isInitView = true;
        isCanLoadData();
        return rootView;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        //isVisibleToUser这个boolean值表示:该Fragment的UI 用户是否可见,获取该标志记录下来
        if(isVisibleToUser){
            isVisible = true;
            isCanLoadData();
        }else{
            isVisible = false;
        }
    }

    private void isCanLoadData(){
        //所以条件是view初始化完成并且对用户可见
        if(isInitView && isVisible ){
            lazyLoad();

            //防止重复加载数据
            isInitView = false;
            isVisible = false;
        }
    }

    /**
     * 加载页面布局文件
     * @return
     */
    protected abstract int setContentView();

    /**
     * 让布局中的view与fragment中的变量建立起映射
     */
    protected abstract void init();

    /**
     * 加载要显示的数据
     */
    protected abstract void lazyLoad();

}

这里需要使用FragmentPagerAdapter,才可以显示的调用setUserVisibleHint()这个方法

子fragment的加载数据的写法:

public class PageFragment extends LazyloadFragment implements XRecyclerView.LoadingListener {
    private CommonAdapter<String> adapter;
    private ArrayList<String> datas = new ArrayList<>();
    private XRecyclerView recyclerView;
    private Handler handler = new Handler();

    @Override
    public int setContentView() {
        return R.layout.fragment_page;
    }


    @Override
    public void init() {
        recyclerView = rootView.findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        adapter = new CommonAdapter<String>(getActivity(),R.layout.item,datas) {
            @Override
            protected void convert(ViewHolder holder, String s, int position) {

            }
        };
        recyclerView.setAdapter(adapter);
        recyclerView.setPullRefreshEnabled(true);
        recyclerView.setLoadingListener(this);

    }

    @Override
    public void lazyLoad() {
        recyclerView.refresh();
    }

    @Override
    public void onRefresh() {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                recyclerView.refreshComplete();
                for(int i=0;i<10;i++){
                    datas.add("");
                }
                adapter.notifyDataSetChanged();
            }
        },500);
    }

    @Override
    public void onLoadMore() {

    }
}

fragment的调用还是像以前一样的调用。

总结:

fragment+viewpage这种模式确实很消耗手机性能与内存,特别是在一些即将淘汰的手机上出现的卡顿也将特别严重,这样实现的懒加载模式可以控制只加载一个fragment,并且还是加载当前的fragment,而不会触发下一个fragment的预加载,就目前来说,我用的这个方法还是挺靠谱的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android多个fragment懒加载的坑(卡顿) 的相关文章

  • U20.4 升级 pytorch 1.11

    一 系统环境 1 系统已安装 pytorch 1 7 1 8 a pip install torch 1 8 2 cu111 torchvision 0 9 2 cu111 torchaudio 0 8 2 f https download

随机推荐

  • 小编必看,教你如何使用微信公众号编辑器快速排版精美文章

    对于小编而言 写作就是每天的日常 图文排版是公众号的形象 也是新媒体运营小编必须掌握的技能 一篇文章除了内容优质之外 排版也是非常重要的 好的排版才能让读者有更好的阅读体验 俗话说 工欲善其事 必先利其器 众多微信公众号编辑器中 推荐使用来
  • CMAKE语法:add_definitions、add_compile_options

    前言 CMAKE命令通用理解 command
  • SQL_开发技巧(附阿里巴巴开发规范)

    目录 一 数据库命令规范 1 1 explain 1 2 单表delete或者update语句 加个limit 1 3 where后字段 隐式转换 1 4 减少不必要的查询字段 1 5 SQL命令行修改数据 养成begin commit 事
  • 【ProVerif学习笔记】6:握手协议(handshake protocol)建模

    这节先不继续往下看 巩固一下对ProVerif建模握手协议的理解 握手协议的流程如下 ex handshake pv 只验证保密性 手册里在引入security性质之前 握手协议的模型如下 对称加密相关 对称密钥 type key 对称加密
  • Cookie中允许的字符

    本文翻译自 Allowed characters in cookies this one s a quickie 这是一个快捷方式 What are the allowed characters in both cookie name an
  • Latex Skills

    ModernCV http 519488126 blog 163 com blog static 722401602014010555221 Paper 1 Blank 两个quad空格 a qquad b a qquad b 两个m的宽度
  • Top 5 OSSInsight 年度最佳 MLOps 开源工具

    MLOps 即机器学习的 DevOps 它能够帮助企业或组织更好地管理生产中的机器学习模型的复杂性 从而使机器学习项目更快速 更可靠地推广到市场 在本文中 我们将回顾 OSSInsight io 2022 年列出的排名前 5 的最热门开源
  • 多业务建模在美团搜索排序中的实践

    总第460篇 2021年 第030篇 美团搜索排序是一个典型的多业务混合排序建模问题 这种多业务场景搜索存在很多挑战 本文聚焦到店商家多业务场景的多业务排序建模优化工作 希望能对从事相关工作的同学有帮助 引言 排序流程简介 多业务建模实践
  • Android token失效统一跳转登陆界面,基于okhttp+广播通信

    第一步找个Activity注册广播监听 一般选择app主框架activity OkHttp拦截器写法 public class TokenInterceptor implements Interceptor private static f
  • Visual Studio(vs)与Pycharm,IDEA中常用快捷键汇总

    目录 Visual Studio 窗口管理 搜索 在编辑器中查找 代码编辑器 工具栏 调试 常用 Pycharm IDEA中 Ctrl 快捷键 Alt 快捷键 Shift 快捷键 Ctrl Alt 快捷键 Ctrl Shift 快捷键 Al
  • C++11 ——— 可变参数模板

    文章目录 可变参数模板的概念 可变参数模板的定义方式 参数包的展开方式 递归展开参数包 逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板的概念 可变参数模板是C 11新增的最强大的特性之一 它对参数高度泛化 能够
  • nginx php站点配置文件,Nginx配置文件详解及多站点配置

    Nginx配置文件详解 配置文件在 etc nginx nginx conf nginx root目录修改报错403解决办法 chmod R 755 目录 usr share nginx html 修改nginx用户为其所有者 chown
  • 前腾讯员工不堪房价回老家进国企!享受清闲日子,但担心又随之而来

    在互联网大厂拿命挣高薪VS回老家进国企提前养老 哪个才是更好的生活 一位前腾讯员工辞职后回老家省会进了国企 过着清闲舒服的日子 却担心再这么下去自己就废了 真是个上进的小哥哥 到手18W 工作量巨少 每天在办公室都不知道干嘛 下午五点就下班
  • 硬盘的三大种类

    文章目录 一 传统硬盘 HDD Hard Disk Drive 二 固态硬盘 SSD Solid State Drive 三 混合硬盘 hybrid hard drive HHD 四 对比 一 传统硬盘 HDD Hard Disk Driv
  • 实验2linux进程控制与通信,实验2 进程控制与通信管理word文档良心出品

    实验2 进程控制与通信管理word文档良心出品 由会员分享 可在线阅读 更多相关 实验2 进程控制与通信管理word文档良心出品 13页珍藏版 请在人人文库网上搜索 1 年级11级专业计算机科学与技术班级五班组号12组实验室9 205日期2
  • ChatGPT?听说Biying把它下架了

    ChatGPT被玩疯了 开始放飞自我 ChatGPT版微软必应上线不到10天 就被网友玩坏了 先说这个词 放飞自我 什么东西才会放飞自我 人放飞自我 人 你确定是人 所以让我们来把上面的句子改写一下 什么东西才会放飞自我 人才会放飞自我 所
  • HTML5实现音频和视频嵌入

    简介 HTML5未出来之前 在线的音频和视频都是借助Flash或者第三方工具实现的 现在HTML5也支持了这方面的功能 在一个支持HTML5的浏览器中 不需要安装任何插件就能播放音频和视频 原生的支持音频和视频 为HTML5注入了巨大的发展
  • [脑科学]-这才是心理学

    这本书出了第9版了 不长 写的挺好 国内也有一本 同样的名字 隋xx写的 文笔也很好 可惜不太有名 1 心理学 就是研究大脑是如何工作的学科 嗯 一定要明白这一点 各种心理学实验就是黑盒测试大脑 脑外科就是白盒研究大脑 要想变得聪明之类的
  • 欢聚集团 -- 前端一面

    面试形式 牛客网面试 一面40多分钟 自我介绍 面试内容 手写事件委托 手写AJAX IE怎么处理 常见的http状态码 和 的区别 js隐式转换 闭包 闭包的结构 原型 原型链 对象的深浅拷贝 深拷贝的实现 怎么获取js对象的自身属性 j
  • Android多个fragment懒加载的坑(卡顿)

    在Android开发中 有很多种情况都是viewpage fragment左右滑动进行布局的 例如下面的今日头条 在今日头条app上 我们可以看到 其顶部都是一栏的类型数据源 可滑动 可联动下面的viewpage里的fragment 但是很