在使用imageloader的过程中如果一个activity里面有较多图片加载,当我们来回切换这个activity时,就会造成内存溢出。在网上查了一点资料,根据别人解析的源码发现 当activity finish时,持有的bitmap没有被释放掉,所以来回多次切换这个activity就会造成内存溢出。而imageloader有个监听会回调返回一个加载生成的bitmap,当我们在onDestory时把bitmap释放掉就会很大程度上释放内存,不至于只切换几次就造成内存溢出。

下面贴出关键代码

public void BaseActivity extends Activity implements ImageLoadingListener{public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//为ImageLoader添加监听ImageLoader.getInstance().setDefaultLoadingListener(this);}protected void onDestory(){super.onDestroy();//释放内存ImageLoader.getInstance().clearDiskCache();ImageLoader.getInstance().clearMemoryCache();//释放被持有的bitmapif(mBitmaps!=null){for(Bitmap bitmap:mBitmaps){if(bitmap!=null&&!bitmap.isRecycled()){bitmap.recycle();}}}}@Overridepublic void onLoadingCancelled(String s, View view) {}private List<Bitmap>mBitmaps;@Overridepublic void onLoadingComplete(String s, View view, Bitmap bitmap) {if(mBitmaps==null){mBitmaps=new ArrayList<>();} mBitmaps.add(bitmap);}@Overridepublic void onLoadingFailed(String s, View view, FailReason failReason) {}@Overridepublic void onLoadingStarted(String s, View view) {}}

这些是处理被持有bitmap的释放,由于imageloader不知道用户需要在什么地方释放,所以需要用户手动添加监听。

下面贴出我再BaseApplication里面Imageloader 的配置 ,与上面的配合使用起来还不错

@Override
public void onCreate() {//这是BaseApplication里的File fileCache = StorageUtils.getCacheDirectory(getApplicationContext());ImageLoaderConfig.initImageLoader(getApplicationContext(), fileCache);
}
/*** Imageloader的配置* * @author yuLook**/
public class ImageLoaderConfig {/*** 返回默认的参数配置* * @param isShowDefault*            true:显示默认的加载图片 false:不显示默认的加载图片* @return*/@SuppressWarnings("deprecation")public static DisplayImageOptions initDisplayOptions(boolean isShowDefault) {DisplayImageOptions.Builder displayBuilder = new DisplayImageOptions.Builder();// 设置图片压缩方式// EXACTLY: 图像将完全按比例缩小的目标大小// EXACTLY_STRETCHED: 图片会缩放到目标大小// IN_SAMPLE_INT: 图像将被二次采样的整数倍// IN_SAMPLE_POWER_OF_2: 图片将降低2倍,直到下一减少步骤,使图像更小的目标大小// NONE: 图片不会调整displayBuilder.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2);if (isShowDefault) {// 默认显示图图片displayBuilder.showStubImage(R.mipmap.grey_logo);// 地址为空的默认显示图片displayBuilder.showImageForEmptyUri(R.mipmap.grey_logo);// 加载失败的显示图片displayBuilder.showImageOnFail(R.mipmap.grey_logo);displayBuilder.showImageOnLoading(R.mipmap.grey_logo);}// 开启内存缓存displayBuilder.cacheInMemory(true);// 开启SDCard缓存displayBuilder.cacheOnDisk(true);// 设置图片的编码格式RGB_565, 此格式比ARGB_8888快displayBuilder.bitmapConfig(Bitmap.Config.RGB_565);displayBuilder.displayer(new FadeInBitmapDisplayer(1000));return displayBuilder.build();}public static void initImageLoader(Context context, File cacheFile) {// 获取本地缓存的目录, 该目录在sd卡的根目录ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(context);builder.threadPoolSize(2);// 设定线程等级比普通的第一点builder.threadPriority(Thread.MIN_PRIORITY);// 设定内存为弱缓存builder.memoryCache(new WeakMemoryCache());
//    builder.memoryCache(new ImageMemoryCache(context));// 设定内存图片缓存大小的限制,不设置默认为屏幕的宽高builder.memoryCacheExtraOptions(280, 400);builder.memoryCacheSize(10 * 1024 * 1024);// 设定只保存同一尺寸的图片在内存builder.denyCacheImageMultipleSizesInMemory();// 设定缓存的SD卡目录,UnlimitDiscCache速度最快builder.diskCache(new UnlimitedDiskCache(cacheFile));// 设定网络连接超时timeout:10s 读取网络连接超时read timeout 60sbuilder.imageDownloader(new BaseImageDownloader(context, 10 * 1000,60 * 1000));// 设置ImageLoader的配置参数builder.defaultDisplayImageOptions(initDisplayOptions(true));// 初始化imageLoaderImageLoader.getInstance().init(builder.build());}

转载于:https://my.oschina.net/yulook/blog/795263

ImageLoader 内存溢出OOM 手动清理缓存相关推荐

  1. Spark 中 JVM 内存使用及配置详情、spark报错与调优、Spark内存溢出OOM异常

    一般在我们开发spark程序的时候,从代码开发到上线以及后期的维护中,在整个过程中都需要涉及到调优的问题,即一开始需要考虑如何把代码写的更简洁高效调优(即代码优化),待开发测试完成后,提交任务时综合考 ...

  2. Java常见内存溢出(OOM)解决方案

    Java 常见内存溢出(OOM)解决方案 一,jvm内存区域   1,         程序计数器 一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. 2,         java栈 与 ...

  3. Java内存溢出(OOM)异常完全指南

    原文:http://luecsc.blog.51cto.com/2219432/1948800 这也许是目前最为完整的Java OOM异常的解决指南. 1.Java.lang.OutOfMemoryE ...

  4. jvm性能调优实战 - 44Metaspace区域是如何因为类太多而发生内存溢出OOM

    文章目录 Pre Metaspace区域是如何触发内存溢出的? 到底什么情况下会发生Metaspace内存溢出? Metaspace OOM 模拟 CGLIB动态生成类的代码示例 限制Metaspac ...

  5. Java内存溢出(OOM)分析

    当JVM内存不足时,会抛出java.lang.OutOfMemoryError. 主要的OOM类型右: Java heap space:堆空间不足 GC overhead limit exceeded ...

  6. Java内存溢出OOM之dump分析

    目录 内存泄露 内存溢出 1.Java堆内存异常 报错方式 原因 2.Java栈内存异常 报错方式 原因 3.方法区内存异常 报错方式 原因 解决思路 生成dump文件三种方式 dump生成 jvis ...

  7. 上传图片重新调整大小导致内存溢出oom

    目录 压测上传人员图片接口 一.了解案发现场情况: 二.分析原因 三.导出oom分析 1. System 时间大于 User 时间 old区回收情况 四.解决方案 五.后续 最近准备优化之前老代码的 ...

  8. 内存溢出(oom)和内存泄漏(leak)

    一.概念介绍: 1.内存溢出 out of memory: 是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的 ...

  9. Java内存溢出OOM使用Mat分析

    示例 package com.rumenz;import java.util.ArrayList; import java.util.List;public class OutOfMemory {pu ...

最新文章

  1. 【Paper】2019_Distributed Cooperative Control of a High-speed Train
  2. 极速发展的饿了么订单系统架构演进--转
  3. Eclipse SVN插件检出Src下面的包变成了文件夹解决
  4. linux编译c 优化,Linux编译选项
  5. Ureport2报表工具金额格式化
  6. PS下载Adobe Photoshop 2020中文安装教程 亲测可用
  7. 使用搜狗接口爬取微信公众号
  8. 破除对 AWS Fargate 的幻觉
  9. 安装银河麒麟系统失败是什么原因
  10. 开源集锦(五)开源框架和快速开发工具类
  11. Bootstrap-30分钟就能上手的Bootstrap教程【史上最全】
  12. 安装mysql最后一步未响应(解决方法)
  13. java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
  14. WinDebug 常用命令表【摘】
  15. 实现热部署的基本原理介绍
  16. PS中可选颜色的计算方法(绝对量)
  17. 18.时钟芯片DS1302
  18. vue中使用vue-seamless-scroll列表循环滚动插件
  19. 单例模式“双重检查锁定Double-Checked Locking”线程安全问题
  20. 在qemu中运行mips架构的debian linux

热门文章

  1. 谷歌浏览器中隐藏的小游戏彩蛋
  2. 使用poi写入Excel
  3. web component指南
  4. 【QT】QSS美化——基础知识
  5. 【Sql Server】SQL Server evaluation period has expired解决方法
  6. 企业微信显示服务器内部错误,微信企业支付接口CryptographicException出现了内部错误 解决办法...
  7. 深度:“网娃”的美国神话与中国迷惘
  8. 使用Flash Builder 4和Flex 4 SDK构建Flickr浏览器
  9. CANfd 一次采样点和二次采样点
  10. 进步的奥秘:自下而上的演变 //转载