博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Recyclerview使用GlideAPP加载大量图片导致内存溢出(oom)
阅读量:4677 次
发布时间:2019-06-09

本文共 2453 字,大约阅读时间需要 8 分钟。

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

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
(){
@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);
@Override public void onViewRecycled(@NonNull ViewHolder holder) {
super.onViewRecycled(holder); ImageView imageView=holder.imageView; if (imageView!=null){
Glide.with(context).clear(imageView); } }
 
 

转载于:https://www.cnblogs.com/qiuqiuQaQ/p/9375907.html

你可能感兴趣的文章
使用框架的——好处
查看>>
如此大量的代码,但每个类里面的代码却不显得特别多,原因。。。。。。。。。。。。...
查看>>
C#特征备忘
查看>>
intelil——快捷键
查看>>
Java 面向对象 之 final 关键字
查看>>
Contact Form 7邮件发送失败的解决办法
查看>>
How to use For loop in CruiseControl.net
查看>>
P1800 software_NOI导刊2010提高(06)
查看>>
Python学习日记(1)使用if __name__ == "main"
查看>>
第八章 线性时间排序 8.3 基数排序
查看>>
创建maven项目
查看>>
二进制的最大公约数
查看>>
彻底弄懂 RTL级,行为级的区别
查看>>
关于PHP开发的9条建议
查看>>
jackson的自动检测机制
查看>>
2019 计蒜之道 初赛 第二场 B. 百度AI小课堂-上升子序列(简单) ( 实现)
查看>>
Python(2.7)-随机函数(random)
查看>>
loadrunner测试c/s架构的应用系统
查看>>
Mybatis学习笔记(一) 之框架原理
查看>>
Aptana 安装与配置
查看>>