引言
首页功能完成后在使用的时候偶尔会崩溃,log一看oom了。
仔细想想现在的布局结构确实会出现这样的问题
只首页这一个Fragment内的ViewPager就包含了21个子Fragment
其中每个子Fragment又包含了多个view每个view都有加载图片,如何形容可怕呢?
单发现Fragment的直接子view就有100个,接口返回的。且子view可能是ViewGroup又包了view。
android profiler显示内存超400M,图片占将近200M,内存优化亟待解决。
正文
先说一下原作:
之前有提到过首页ViewPager设置了近10个缓存(我只设置了3个),滑动内容时并没有卡顿和oom,图片的加载也很流畅。
有一个小细节引起了我的注意,当Fragment滑动到底部后在此滑到顶部时,图片的加载效果是渐显的。明显做了手脚,先标记一下,至于是什么暂时还没搞懂。
优化
1、Fragment
onCreateView每次会inflate一个View出来,多Fragment来回切换时inflate会更多
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_content, container, false)
}
在每个Fragment内会存在多图,因此onDestroyView时清除内存占用
Glide.get(context).clearMemory()
System.gc()
2、ViewPager
设置ViewPager的缓存数量
viewPager.offscreenPageLimit=3
3、图片格式
之前Glide操作的所有图片为ARGB_8888此种格式一像素会占用32位4字节。现在改为最小的RGB_565,这种格式占16位2字节,足足缩了一倍。
4、Glide
设置成只保存,修改后的图片
.diskCacheStrategy(DiskCacheStrategy.RESULT)
5、滑动时不加载图片
给RecyclerView设置滑动监听,当RecyclerView的状态为SCROLL_STATE_IDLE时加载图片
通过上述的操作图片占内存最高为130M且没有oom,总觉得还差了点什么,先标记这些以后再继续