最近整理项目要用到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");
}
}
“`