ViewPager+Fragment相关,优化第一个Fragment启动速度

最近整理项目要用到ViewPager+Fragment,所以在此记录一下。

Fragment的主要优点:

1.fragment可以重用
2.fragment耦合度低,在内部处理自己的业务就像activity一样,逻辑清晰,Activity只要管理好几个fragment就可以了。
3.动态灵活的UI设计,可以适应于不同的屏幕尺寸。
4.占用内存降低,同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快了很多。

Fragment的优化

在日常工作中,ViewPager常常与Fragment搭配使用,因为确实很方便但是,当Fragment过多时,常常会造成卡顿现象,甚至是OOM,总体上优化Fragment大概是以下几个思路。

1.精简Fragment

精简布局,提高加载速度。

2.防止Fragment被销毁

ViewPager在切换的时候,如果频繁销毁和加载Fragment,就容易产生卡顿现象,阻止Fragment的销毁可有效减缓卡顿现象。

3.延迟加载Fragment内容

在切换到当前Fragment的时候,并不立刻去加载Fragment的内容,而是先加载一个简单的空布局。这样实例化的时候,速度会快一些。当Fragment可见的时候,再加载内容。
在Fragment创建的时候,执行生命周期为onAttach–》–》Activity的onAttachFragment–》onCreate–》onCreateView–》onActivityCreated–》onStart–》onResume。 所以,如果一次性实例化太多Fragment,在这些生命周期中执行耗时操作,很容易出现卡顿现象。那么,启动第一个Frament的时候会非常慢,因为要把这些生命周期走完。

解决方法:

1: 异步线程进行初始化.

在onCreate()的时候去开启一个异步线程,最后把结果Handler到主线程.
缺点:线程启动会造成性能消耗。

2: postDelay(r,n)
页面显示后,在进行初始化操作。

3:正确的界面初始化完成时机,Activity同理。

.主线程是一个完全不能承受耗时操作的循环.而Activity的生命周期函数都是通过Loop的消息依次被执行的.

public class BaseFragment extends Fragment {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Looper.myQueue().addIdleHandler(new IdleHandler() {
            @Override
            public boolean queueIdle() {
                onInit();
                return false; //false 表示只监听一次IDLE事件,之后就不会再执行这个函数了.
            }
        });
    }
    //子类重写此函数即可,而不需要在onCreate()中去初始化.
    protected void onInit() {
        Log.e(TAG, "onInit");
    }
}


“`

阅读更多

没有更多推荐了,返回首页