注意***如标题主要针对Glide第三方库加载图片造成的OOM。
- 如果APP使用中多次多个模块同时加载或者频繁加载,由内存频繁抖动造成OOM,可添加代码:
android:largeHeap=“true”
<application
android:name=".hotfix.SophixStubApplication"
android:allowBackup="true"
android:icon="@mipmap/im_app_icon_app"
android:label="@string/app_name"
android:supportsRtl="true"
android:largeHeap="true"
android:theme="@style/MyAppTheme">
- 如果滑动容器中图片条目过多引起OOM,需要多些细节处理
- a.可以设置磁盘缓存的大小
@GlideModule
public class CustomCachingGlideModule extends AppGlideModule {
/** * MemorySizeCalculator类通过考虑设备给定的可用内存和屏幕大小想出合理的默认大小. * 通过LruResourceCache进行缓存。 * @param context * @param builder */
@Override
public void applyOptions(Context context, GlideBuilder builder) {
MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context) .setMemoryCacheScreens(2) .build();
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize()));
int diskCacheSizeBytes = 1024 * 1024 * 500; // 100 MB
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
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 boolean isManifestParsingEnabled() {
return false;
}
}
在清淡文件application节点下添加代码引入
<meta-data
android:name="news.dvlp.hostapp.platform.utils.CustomCachingGlideModule"
android:value="GlideModule"/>
- b.:在加载图片的时候,不要缓存资源,如果可以获取控件尺寸的话,可以控制加载的尺寸,
Glide.with(paramContext)
.load(paramObject)
.skipMemoryCache(true) //禁止Glide内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE) //不缓存资源
// .override(500, 500)
.into(paramImageView);
- c.在Adapter中重写这个方法,当item被隐藏的时候,调用 Glide.with(context).clear(imageView);
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
super.onViewRecycled(holder);
ImageView imageView=holder.imageView;
if (imageView!=null){
Glide.with(context).clear(imageView);
}
}
- d. 如果是加载本地的图片资源,需要在页面销毁时及时回收
Glide.with(context).clear(imageView);
结尾**通过以上代码改善了本人在开放中遇到的OOM问题,希望对大家有所帮助。
一个在线图片压缩工具:https://tinypng.com/