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

简介:

内存泄露的检测。

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

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

如果是下面这样大致平稳的曲线,就没有内存泄露。

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

如果得知哪些函数耗费了大量内存呢?可以记录内存的使用过程,加以分析,点击内存窗口的Start Allocation Tracking按钮开始记录,使用完再次点击停止记录。

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

一点经验:

用FragmentStatePagerAdapter代替FragmentPagerAdapter

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

减小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匿名对象则可忽略此条。

本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/p/4717936.html,如需转载请自行联系原作者

相关文章
|
缓存
ViewPager的缓存机制和懒加载实现
ViewPager的缓存机制和懒加载实现
|
前端开发 Java Linux
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和V
194 0
|
缓存
ViewPager懒加载的实现,理解setUserVisibleHint,而不只是会用就好
Viewpager默认会缓存临近操作的两个页面,也就是至少会缓存一个页面。
150 0
ViewPager懒加载的实现,理解setUserVisibleHint,而不只是会用就好
|
Android开发
关于Android ViewPager禁止滑动
ViewPager默认是可以手动切换的,实现自动切换,可以通过定时器来完成,而有些时候,我们是需要禁止ViewPager手动切换的, 这个时候就需要自定义ViewPager了,其实也很简单,原理就是拦截触摸事件,让ViewPager不处理onTouch事件,直接交给他的子控件去处理就行。
219 0
|
XML 数据格式
千变万化的ViewPager指示器-MagicIndicator
千变万化的ViewPager指示器-MagicIndicator
千变万化的ViewPager指示器-MagicIndicator
|
Android开发
Android笔记:ViewPager和TabLayout连用时,去除ViewPager预加载
Android笔记:ViewPager和TabLayout连用时,去除ViewPager预加载
172 0
ViewPager(通过反射修改viewpager切换速度)
(创建于2016/11/17) import java.lang.reflect.Field; import android.content.
1078 0
|
容器 索引
ViewPager+Fragment取消预加载(延迟加载)
在项目中,都或多或少地使用的Tab布局,所以大都会用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。 例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第二个Fragment时,它会帮你加载第三个Fragment。 这样虽然有
1507 0
|
Android开发 容器
Android开发之ViewPager切换动画
Android从3.0开始,ViewPager也开始有了切换动画,ViewPager有个setPageTransformer()方法,用于设置ViewPager切换时的动画效果。
901 0