【karle 笔记】Glide加载大图片OOM(完美解决)

注意***如标题主要针对Glide第三方库加载图片造成的OOM。

  1. 如果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">
  1. 如果滑动容器中图片条目过多引起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/

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值