ViewPager加载图片OOM解决过程

问题描述

通过一个ViewPager加载图片,每个ItemView里面有一个ImageView和一个ProgressBar。当调用instantiateItem的时候,会启动一个AsyncTask去下载图片并显示。但是不断地滑动图片,大概二三十张的时候就会崩溃,报OOM错误。

解决思路

由于每当调用instantiateItem的时候,我都会重新inflate一个新的View,然后保存在数组里面。在destroyItem方法里面去调用container.remove()方法,但是由于View的引用仍然保存在数组里面,所以View就无法得到回收,所以在remove的时候,也同时将数组相应的元素设为了null。在AsyncTask里面也有ImageView和ProgressBar的引用,可能造成了内存泄露。后来就改为了WeakReference去保存ImageView。
但是问题依然没有解决,然后继续想办法,想到了图片里面的bitmap可能要手动释放,就在destroyItem的时候,手动将ImageView的bitmap进行释放,调用了bitmap的recycle方法。
后来发现情况有所好转,但是滑多了还是会有问题。
就想到了ViewPager其实不需要一直inflate View,可以在初始化ViewPager的时候就inflate几个View,我是创建了4个View,然后之后的滑动就一直重复利用这4个View,通过取模运算,使用相应的View,果然就内存就上升的很慢,而且上升上去之后也能通过GC降下来。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。