安卓如何回收返回栈底部页面中的图片内存?

logan676 发布于 2017/07/12 09:34
阅读 62
收藏 0

安卓应用为了能打开几十个有图片的页面,比如60个,使用默认的内存管理机制是不够的。经测试使用默认的内存管理机制打开10个左右的含图片的页面时app占用内存就达到了200多兆,这导致新开的页面就没有足够内存显示图片了。

所以这里需要优化图片内存管理,显然使用默认的机制是不行的。

市面上很多优秀的app都能打开100多个页面而不卡,图片也能正常加载(比如B站的app),这个优化非常好,可惜我不了解这是怎么实现的。我看了下B站的app,它并没有把返回栈底部的页面杀死,因为点返回键一步步返回时很流畅。

那我能想到的方案就是回收返回栈底部页面中的图片资源,毕竟图片才是消耗内存的大户。当内存不足时,回收不可见的页面的图片资源。

但是请问各位大牛这该如何实现呢?

 

加载中
0
九离天
九离天

推荐你去看看 Picasso,Glide,Fresco 类似的,不一定看源码,百度看看大牛的大致分析。

0
toldo
toldo

你要理解Android的内存回收机制。然后根据自己的需求去应用。

1.  强引用
以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。

2.软引用(SoftReference)
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

3.弱引用(WeakReference)
如果一个对象只具有弱引用,那就类似于可有可物的生活用品。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。

4. 虚引用

用的比较少,就不管它了
 

返回顶部
顶部