Glide加载大量的图片导致的OOM解决总结

作者: android 发布时间: 2020-02-01 浏览: 7080 次 编辑

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