android imageloader 内存溢出,imageloader 内存溢出OOM

使用 imageloader 时 反复频繁滑动 会造成 oom

项目使用的 是viewpage + fragment ,fragment中加载图片

由于需要fragment数量过大,反复滑动造成imageloader oom

解决:

初始化imageloader时 参数设置:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()

.cacheInMemory(true).imageScaleType(ImageScaleType.EXACTLY)

.cacheOnDisk(true).build();

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(

context)

.threadPoolSize(3)

// default

.threadPriority(Thread.NORM_PRIORITY - 2)

.denyCacheImageMultipleSizesInMemory()

.diskCacheFileNameGenerator(new Md5FileNameGenerator())

.tasksProcessingOrder(QueueProcessingType.LIFO)

.denyCacheImageMultipleSizesInMemory()

// .memoryCache(new LruMemoryCache((int) (6 * 1024 * 1024)))

.memoryCache(new WeakMemoryCache())

.memoryCacheSize((int) (2 * 1024 * 1024))

.memoryCacheSizePercentage(13)

// default

.diskCache(new UnlimitedDiscCache(cacheDir))

// default

.diskCacheSize(50 * 1024 * 1024).diskCacheFileCount(100)

.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())

.defaultDisplayImageOptions(defaultOptions).writeDebugLogs() // Remove

.build();

// Initialize ImageLoader with configuration.

ImageLoader.getInstance().init(config);

OutOfMemoryError

虽然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?

减少线程池中线程的个数,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推荐配置1-5

在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存

在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(new WeakMemoryCache()) 或者不使用内存缓存

在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)

通过上面这些,相信大家对Universal-Image-Loader框架的使用已经非常的了解了,我们在使用该框架的时候尽量的使用displayImage()方法去加载图片,loadImage()是将图片对象回调到ImageLoadingListener接口的onLoadingComplete()方法中,需要我们手动去设置到ImageView上面,displayImage()方法中,对ImageView对象使用的是Weak references,方便垃圾回收器回收ImageView对象,如果我们要加载固定大小的图片的时候,使用loadImage()方法需要传递一个ImageSize对象,而displayImage()方法会根据ImageView对象的测量值,或者android:layout_width and android:layout_height设定的值,或者android:maxWidth and/or android:maxHeight设定的值来裁剪图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值