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()懒加载过时问题优化
587 0
|
Java 大数据 数据库
Activity卡顿、变慢的原因
Activity卡顿、变慢的原因
|
前端开发 Java Linux
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
242 0
|
缓存 算法
图文DEMO并茂讲解RecyclerView滑动时回收和复用触发的时机
图文DEMO并茂讲解RecyclerView滑动时回收和复用触发的时机
图文DEMO并茂讲解RecyclerView滑动时回收和复用触发的时机
|
缓存 开发者
关于recyclerview复用导致应用卡顿崩溃
recyclerview复用导致应用卡顿崩溃
241 0
|
XML Android开发 数据格式
Android ScrollView嵌套RecyclerView滑动卡顿
Android ScrollView嵌套RecyclerView滑动卡顿
419 0
|
缓存 Android开发
android Fragment单页面加载,避免重复加载(懒加载)分析
android Fragment单页面加载,避免重复加载(懒加载)分析
|
前端开发 容器
Flutter中ListView加载图片数据的优化
在使用ListView懒加载模式时,当ListView的Item中有图片信息时,在快速滚动过程中会大量的浪费流量与内存,甚至会造成在滚动过程中页面的卡顿效果。 在这里提出优化方案,当开始滚动时不加载图片,滚动结束后再加载图片,这个优化方案实现的效果如下图所示,在快速滑动列表数据时,图片未加载,运行内存无明显波动。
Flutter中ListView加载图片数据的优化
|
Android开发 开发者
Android NestedScrollView嵌套RecyclerView滑动卡顿问题简洁解决方案
Android NestedScrollView嵌套RecyclerView滑动卡顿问题简洁解决方案 其实仅仅需要给RecyclerView加一行控制代码即可:mRecyclerView.
5353 0