fragment卡顿 的处理

简介: fragment卡顿 的处理
 
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.add(ViewId,fragment);// 或者fragmentTransaction.replace(ViewId,fragment);
fragmentTransaction.commit();
 
 
基础更好一点的同学会用show和hide方法
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(new FirstFragment()).show(new SecondFragment())


fragment 每次在add/replace或者show/hide都会 new 一个新的实例,这就是致命原因!!!!!


滑动卡顿主要的原因是因为每次切换viewpager的时候,会去缓存设定的页面个数,导致每次都会有fragment里的生命周期被重新调用,一些初始化内容,网络请求等被无限调用。


解决步骤分为两步:


1、首先将viewpager的缓存个数设置为fragment的个数,也就是页面的个数。

例如:viewPager.setOffscreenPageLimit(7);这样可以在第一次创建viewpager和fragment的时候就将所有的页面都缓存,再次切换页面的时候就不会在去缓存已经被缓存的fragment页面。


2、给Fragment写懒加载,只有当前Fragment处于可视窗口的时候会被调用。

重写Fragment的setUserVisibleHint方法,adapter中的每个fragment切换的时候都会被调用,如果是切换到当前页,那么isVisibleToUser==true,否则为false。

3.动态加载模式:

//首先需要先实例好n个全局Fragment
 
//private  Fragment  currentFragment=new Fragment();(全局)
 
 
private  FragmentTransaction switchFragment(Fragment targetFragment) {
        FragmentTransaction transaction =getSupportFragmentManager().beginTransaction();
        //第一次使用switchFragment()时currentFragment null,所以要判断一下
        if (!targetFragment.isAdded()) {
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            transaction.add(R.id.fragment,targetFragment,targetFragment.getClass().getName());
        } else {
            transaction.hide(currentFragment).show(targetFragment);
        }
        currentFragment = targetFragment;
        return transaction;   
    }
在点击切换Fragment时:
 
 
@Override
public void onTabSelected(@IdRes int tabId) {
 
        if (tabId == R.id.tab_one){
 
            switchFragment(first).commit();
 
        }
        if (tabId == R.id.tab_two){
            switchFragment(second).commit();
        }
        if (tabId == R.id.tab_three){
            switchFragment(third).commit();
        }
}


只实例一次,那我的Fragment里的数据要更新怎么办?我的回答是——软件关了再次重启!


好在官方提供了onHiddenChanged方法,每次切换hide或者show时该方法会被执行,可以在这里面更新数据!

//此方法在Fragment中
 
@Override public void onHiddenChanged(boolean hidden) {    
super.onHiddenChanged(hidden);    
if (hidden){
    //Fragment隐藏时调用    
}else {     
    //Fragment显示时调用   
}
}

此方法是不是比每次add或replace更新数据执行一大坨的生命周期要优雅的多的多!

 


目录
相关文章
|
8月前
|
Android开发 开发者 容器
android FragmentManager 删除所有Fragment 重建
通过本文,我们详细介绍了如何使用 `FragmentManager`删除所有Fragment并重建。通过理解和应用这些步骤,可以在实际开发中更灵活地管理Fragment,满足各种应用场景的需求。希望本文能帮助开发者更好地掌握Fragment管理技巧,提高应用开发效率和代码质量。
156 8
|
JSON JavaScript 前端开发
Google Charts
Google Charts
305 4
|
Java Android开发
Android oom pthread_create (1040KB stack)分析及解决
Android oom pthread_create (1040KB stack)分析及解决
400 0
|
12月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
672 63
|
12月前
|
Java Shell Linux
从 am start 的 --user 参数说到 Android 多用户
am start 命令有时并不会乖乖如我们所愿,这时候我们需要知对策并知其所以然。
290 16
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
1874 1
|
存储 关系型数据库 MySQL
关系型数据库mysql验证数据完整性
【7月更文挑战第2天】
447 1
|
Docker 容器
【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)
【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)
180 1
|
API 网络安全 数据安全/隐私保护
outlook邮箱imap怎么开启
outlook邮箱imap怎么开启