在Recyclerview使用GlideAPP加载大量图片致使内存溢出(oom)

网络上有不少解决的办法,可是都是在清理磁盘缓存和内存上作,并不能及时释放内存。缓存

1.能够在每次请求数据和加载数据后调用网络

/** * 清除内存缓存. */
public static void clearMemoryCache(Context context){
// This method must be called on the main thread.
System.gc();
// Glide.get(context).clearMemory();
GlideApp.get(context).clearMemory();
}


/** * 清除磁盘缓存.必须在子线程里作 */
public static void clearDiskCache(Context context){
System.gc();
new AsyncTask<Void,Void,Void>(){
@Override protected Void doInBackground(Void... params) {
// This method must be called on a background thread.
GlideApp.get(context).clearMemory();
// Glide.get(context).clearDiskCache(); return null; }
};
}
2.能够设置磁盘缓存的大小
@GlideModule
public final class MyGlideModule 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));



}

@Override
public boolean isManifestParsingEnabled() {
return false;
}



}
3.如下是尽可能减小图片资源的大小
GlideApp.with(context).asDrawable().load(url)).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.ALL).apply(MyUtils.gildeOptions()).into(imageView);
(1)相对而言,asDrawable()比asBitmap要省(具体相关能够去百度)
(2).skipMemoryCache(true)跳过内存缓存。
(3).diskCacheStrategy(DiskCacheStrategy.ALL)所有使用磁盘缓存
(4)裁剪图片大小.override(200,200);下面是具体使用方法
public static RequestOptions gildeOptions(){
RequestOptions options = new RequestOptions();
options.fitCenter() .placeholder(R.drawable.default_head) .error(R.drawable.default_head) .fallback(R.drawable.default_head).override(200,200);
return options;
}

以上是网络上学习的方法,可是仍是会出现OOM,下面是我本身处理的,效果很明显,但愿能帮到你们。

在Recyclerview中重写这个方法,当item被隐藏的时候,调用 Glide.with(fragment).clear(imageView);
@Overridepublic void onViewRecycled(@NonNull ViewHolder holder) {    super.onViewRecycled(holder);    ImageView imageView=holder.imageView;    if (imageView!=null){        Glide.with(context).clear(imageView);    }}
相关文章
相关标签/搜索