Glide果然好用,调用方便,提供多种图片加载框架,一直用的是Glide,这里我也没有改,项目上线一个月了,突然测试发现一个问题,就是图片是概率黑屏,我一致以为是图片未下载成功,就没在意,因为老化房有一台设备,一致在运行,没有出现这个问题,后来我自己下载了4K的高清出片,来测试,果然
OOM,很好奇,Glide应该有缓存处理的工作,但是我无论怎么优化,还是OOM,
从studio监控的内存状态,目前系统给APP分配的内存是60M .加载10张图就差不多58M了,在加载两张必OOM。那么试试加大APP运行内存
<application android:name="com.EtvApplication" android:allowBackup="true" android:icon="@mipmap/app_icon_green" android:label="@string/app_name" android:largeHeap="true" android:supportsRtl="true" android:theme="@style/AppTheme">
这行代码就是加大APP运行内存的 <!--android:largeHeap="true"-->
果然有效,直接分配了将近200M的运行内存,一下子就解决了这个问题
在配合Glide其他的配置,后来就灭有出现OOM的情况了,
1:在清单文件里面加大APP运行内存
<application android:name="com.EtvApplication" android:allowBackup="true" android:icon="@mipmap/app_icon_green" android:label="@string/app_name" android:largeHeap="true" android:supportsRtl="true" android:theme="@style/AppTheme">
2:自定义Glide缓存尺寸这段代码我也是抄的
package com.etv.util.image; import android.content.Context; import com.bumptech.glide.Glide; import com.bumptech.glide.GlideBuilder; import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool; import com.bumptech.glide.load.engine.cache.LruResourceCache; import com.bumptech.glide.load.engine.cache.MemorySizeCalculator; import com.bumptech.glide.module.GlideModule; public class CustomCachingGlideModule implements GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { MemorySizeCalculator calculator = new MemorySizeCalculator(context); int defaultMemoryCacheSize = calculator.getMemoryCacheSize(); int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize); int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize); builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize)); builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize)); } @Override public void registerComponents(Context context, Glide glide) { // nothing to do here } }
3:在加载图片的时候,不要缓存资源,如果可以获取控件尺寸的话,可以控制加载的尺寸,
override(width,height)
Glide.with(paramContext) .load(paramObject) .skipMemoryCache(true) //禁止Glide内存缓存 .diskCacheStrategy(DiskCacheStrategy.NONE) //不缓存资源 // .override(500, 500) .into(paramImageView);
通过以上的方法,基本可以解决OOM的问题,
标签:
Glide OOM