自从实习以来一直在忙着赶项目进度,没有时间(懒)总结。现在终于有空总结一下这两个多月的收获了。从性能优化中的fragment懒加载开始梳理吧。
项目中使用ViewPager+Fragment,拿练手项目xMusic来说吧,在MainActivity中有两个fragment,一个是本地播放页面,一个是“发现”页面,“发现”页面包含广告轮播图和推荐歌单,图片资源比较多。正常打开app时两个fragment都会进行网络请求加载资源。刚打开app的时候,内存占用能上到88-90m。对于很大一部分只听本地歌曲的用户来说,加载“发现”页面不仅占用内存,还消耗网络资源。
ViewPager中有一个方法 setOffscreenPageLimit(int limit) 可以设置预加载的页面数量。通过源码我们可以知道,这个方法设置的limit最终都不会小于1。因此对于我们这种情况,setOffscreenPageLimit(int limit)是无效的。
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "
+ DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}
这时候就需要使用fragment的懒加载机制,在用户手动滑入“发现”页面时fragment才进行加载,节省资源。
fragment中提供一个方法 setUserVisibleHint,这个方法会在fragment对用户可见/不可见时回调,但是它并不在fragment的生命周期中,因此无法保证和生命周期方法的调用顺序。
创建一个抽象类BaseLazyFragment,然后定义几个标识位
private boolean isFirstVisible = true;
private boolean isFirstInvisible = true;
private boolean isViewCreated;
private boolean isUIVisible;
重