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更新数据执行一大坨的生命周期要优雅的多的多!

 


目录
相关文章
Flutter ListView懒加载(滑动不加载,停止滑动加载)
前言:为了更好的减小网络的带宽,使得列表更加流畅,我们需要了解懒加载,也称延迟加载。关于上一章的登录界面,各位属实难为我了,我也在求ui小姐姐,各位点点赞给我点动力吧~
|
Android开发
Android | Fragment.setUserVisibleHint()懒加载过时问题优化
Fragment.setUserVisibleHint()懒加载过时问题优化
353 0
|
Java 大数据 数据库
Activity卡顿、变慢的原因
Activity卡顿、变慢的原因
|
前端开发 Java Linux
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
204 0
|
缓存 开发者
关于recyclerview复用导致应用卡顿崩溃
recyclerview复用导致应用卡顿崩溃
191 0
|
XML Android开发 数据格式
Android ScrollView嵌套RecyclerView滑动卡顿
Android ScrollView嵌套RecyclerView滑动卡顿
276 0
|
缓存 Android开发
android Fragment单页面加载,避免重复加载(懒加载)分析
android Fragment单页面加载,避免重复加载(懒加载)分析
|
开发工具 Android开发
Android冷启动白屏问题
1. 冷启动与热启动 通常我们在使用某个应用程序时,都是点击桌面应用图标来启动该程序。你肯定或多或少的碰到过这种情况:应用启动的一刹那,手机会先白屏或者黑屏一段时间,然后再进入应用程序的主页,但是你退出应用后再次打开APP,确又发现白屏时间极短或者压根感觉不出来。
1999 0
|
Android开发 开发者
Android NestedScrollView嵌套RecyclerView滑动卡顿问题简洁解决方案
Android NestedScrollView嵌套RecyclerView滑动卡顿问题简洁解决方案 其实仅仅需要给RecyclerView加一行控制代码即可:mRecyclerView.
5238 0
Fragment懒加载(四) 与 EditText在PopupWindow上的BUG
这篇讲两个内容,因为感觉内容都太少了,所以就合起来写一篇算了。 一.Fragment懒加载(四)对Fragment的封装 我之前写过一篇文章说过要实现Fragment的懒加载,要定义3个参数,如果进行懒更新的话还要加一个参数,所以想想如果你的每个fragment都要定义4个参数,至少我觉得这样的代码扩展性不是很好,所以我就写了个LazyFragment对懒加载的操作进行封装。
1100 0