使用ViwePager显示图片时如何防止内存泄露。

内存泄露的检测。异步

1. 在Android Studio中运行你的应用,而后切换到输出窗口的Android tab。函数

2. 尽情的玩耍你的应用,最好各个功能都用到,若是是Viewpager,则多滑动一些页面,观察内存的增加状况。对象

若是是下面这样大体平稳的曲线,就没有内存泄露。blog

若是是下面这样,阶梯状的曲线,基本是有内存泄露了。图片右上角显示已经分配了178.16M,一旦这个数字超过200M,程序就会崩掉。进程

若是得知哪些函数耗费了大量内存呢?能够记录内存的使用过程,加以分析,点击内存窗口的Start Allocation Tracking按钮开始记录,使用完再次点击中止记录。图片

在弹出的记录文件中能够找到使用内存较多的函数调用。这个方法浏览内存使用的状况,不能肯定内存泄露的地方。内存

一点经验:it

用FragmentStatePagerAdapter代替FragmentPagerAdapter

前者保证再也不显示的页面(Off-Screen page)可以被及时删除,释放掉内存,可是bitmap内存再也不此列。io

减少bitmap尺寸

使用bitmap是要尽可能使用小尺寸的,由于Android中一个bitmap占多大内存是由其尺寸决定的,而不是其所占硬盘空间的大小决定的。好比一个512 * 512的色彩斑斓的图片,一个1024  * 1024的黑白图片,前者所占硬盘空间更大,可是加载到Android中,后者所用内存确是前者的四倍!由于Android是按 1024 * 1024来分配内存,它无论你像素是什么样色。垃圾回收

使用完的bitmap要及时回收内存。

bitmap = null是一句颇有用的代码。这样能够再也不引用某个对象,加快垃圾回收的进程。

ImageView.setImageDrawable(null)也是脱离对以前设置的位图的引用。急速垃圾回收。

上面这两句放到Activity或者Fragment的onDestroy方法中,有奇效!

当心使用AsyncTask进行异步加载

记得在Activity或者Fragment的onDestroy方法中将AsyncTask的实例置空。不然里面引用的Bitmap内存没法释放!

若是使用ASyncTask匿名对象则可忽略此条。

==