bitmap在android中使用较多,但是如果不对其进行回收,将会导致内存问题。

【第一种方法】及时回收bitmap内存:

一般而言,回收bitmap内存可以用到以下代码

if(bitmap != null && !bitmap.isRecycled()){

bitmap.recycle();

bitmap = null;

}

System.gc();

bitmap.recycle()方法用于回收该bitmap所占用的内存,接着将bitmap置空,最后,别忘了用System.gc()调用一下系统的垃圾回收器。

在这里要声明一下,bitmap可以有多个(以为着可以有多个if语句),但System.gc()最好只有一个(所以我将它写在了if语句外),因为System.gc()

每次调用都要将整个内存扫描一遍,因而如果多次调用的话会影响程序运行的速度。为了程序的效率,我将它放在了所有回收语句之后,

这样已经起到了它的效果,还节约的时间。

回收bitmap已经知道了,那么“及时”怎么理解呢?

根据我的实际经验,bitmap发挥作用的地方要么在View里,要么在Activity里(当然肯定有其他区域,但是原理都是类似的),

回收bitmap的地方最好写在这些区域刚刚不使用bitmap了的时刻。

比如说View如果使用了bitmap,就应该在这个View不再绘制了的时候回收,或者是在跳转到的下一个区域的代码中回收;

再比如说SurfaceView,就应该在onSurfaceDestroyed这个方法中回收;

同理,如果Activity使用了bitmap,就可以在onStop或者onDestroy方法中回收......

结合以上的共同点,“及时回收”的原理就是在使用了bitmap的区域结束时或结束后回收。

【第二种方法】压缩图片:

这个方法当然很简单了,就是使图片体积大小变小,

可以有两种方式:

一种是使图片质量降低(分辨率不变),

另一种是使图片分辨率降低(分辨率改变)。

总之,使图片大小变小就行了。

实践证明,使图片质量降低(分辨率不变)可以大幅度地减小体积,而且质量的差异肉眼看上去并不明显。

我刚开始使用的就是这两种方法,原理很简单,可是,我的BUG发生虽然没那么频繁了,但是它依然存在!!

后来经过几天的努力与尝试,结合我项目的一些具体情况,我终于解决了这个令人头痛的BUG,但是事实却有点出乎我的意料。

当我使用了上述两种方法BUG依然还没解决的时候,我开始怀疑,bitmap超过8M会报错,可现在我把前前后后的bitmap都回收了,

不可能还有8M了,那为什么还会报错呢?

终于我发现了这个原因:当内存中已经被一些bitmap使用过之后,无论被回收与否,它都会变得特别“敏感”,这个时候,

如果bitmap突然要占用大量的内存,即使和之前已经剩下的内存加起来不到8M,系统也会报错,原因是它变“敏感”了!

我不知道这个用底层原理如何解释比较好,但是我想“敏感”这个词应该可以很形象地进行解释。

于是,为了顺应内存的“敏感性”,我将那个需要同时装载多个大体积bitmap的地方进行了修改,用到了以下方法:

//压缩,用于节省BITMAP内存空间--解决BUG的关键步骤

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inSampleSize = 2;    //这个的值压缩的倍数(2的整数倍),数值越小,压缩率越小,图片越清晰

//返回原图解码之后的bitmap对象

bitmap = BitmapFactory.decodeResource(Context, ResourcesId, opts);

即先将图片缩小一倍,再将这缩小了一倍的图片作为bitmap存入内存,这样一来,它占用的bitmap内存大大减小。

后来经测试,BUG果然解决了。图片缩小一倍后,顺应了内存的“敏感性”,也就不会再报错了。

以上方法应该足以解决大多数bitmap内存溢出问题,但是具体情况还是要具体分析。

版权声明:本文为博主原创文章,未经博主允许不得转载。

android bitmap回收,android BitMap回收相关推荐

  1. Android内存优化(二)之Bitmap的内存申请与回收(Android N和O的对比)

    在Android O上大面积的爆了大量native Bitmap相关的泄漏问题,最大能达到几十MB,开始怀疑是出现了native内存泄漏问题,但经分析后发现是Android N和Android O在处 ...

  2. 关于bitmap,为什么android会有bitmap

    2019独角兽企业重金招聘Python工程师标准>>> 一直纠结的问题终于解决了,就是bitmap这个玩意 之前在android中,大量的使用图片,不仅可以使用Imageview来显 ...

  3. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )

    文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...

  4. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  5. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

    文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...

  6. Android的内存分配与回收

    想写一篇关于android的内存分配和回收文章的想法来源于追查一个魅族手机图片滑动卡顿问题,我们想了很多办法还是没有避免他不停的GC,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GC ...

  7. 探究Bitmap在Android中的内存占用

    一.Bitmap的内存占用检测 Bitmap 一直以来都是 Android App 的内存消耗大户,很多 Java 甚至 native 内存问题的背后都是不当持有了大量大小很大的 Bitmap,我们可 ...

  8. Android 自定义View Canvas —— Bitmap

    Bitmap 绘制图片 常用的方法有一下几种 (1) drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint ...

  9. 【Android 内存优化】Bitmap 长图加载 ( BitmapRegionDecoder 简介 | BitmapRegionDecoder 使用流程 | 区域解码加载示例 )

    文章目录 一.BitmapRegionDecoder 简介 二.图片信息 三.BitmapRegionDecoder 对象创建 四.解码图像 五.图像区域解码示例 六.源码及资源下载 一.Bitmap ...

最新文章

  1. html android canvas兼容_快来!这里有5分钟看完马上学会的HTML基础大全
  2. 【Android 安全】DEX 加密 ( Application 替换 | 分析 Activity 组件中获取的 Application | ActivityThread | LoadedApk )
  3. 跨平台日志清理工具 Log-Cutter v1.0.3 正式发布
  4. SNMP监控一些常用OID的总结
  5. 复现经典:《统计学习方法》第14章 聚类方法
  6. python实现二叉树和它的七种遍历
  7. 尚未注册 OLE DB 访问接口 SQLNCLI10 7043 错误
  8. python递归调用详解_Python递归调用自己的函数
  9. mysql存储过程知识点_知识点:Mysql 基本用法之存储过程
  10. cisco packet tracer实验案例-重置路由器ENABLE特权密码
  11. 蒋涛:重新回归的我,将带领 CSDN 全方位升级,为 AI 转型者打造一站式平台
  12. clean code
  13. java 导出数据到excel
  14. 转:ibatis配置简介
  15. smbclient用法
  16. 百度计算机视觉算法工程师面试题(秋招)
  17. 2021中青杯数学建模A题
  18. java楼盘管理系统_课内资源 - 基于Java面向对象开发的房屋中介管理系统
  19. Python安装过程中出现“找不到指定的路径”的解决办法
  20. ACdream 1424 Diversion(树链剖分+线段树)

热门文章

  1. 暨南大学21考研计算机上岸吐槽贴经验贴流水账
  2. 搜狗微信爬虫获取文章信息
  3. 高三计算机教学计划,高三上学期教学教学计划集锦5篇
  4. python名片识别_百度AI攻略:名片识别
  5. 山西大学生计算机设计大赛,2017中国大学生计算机设计大赛山西赛区决赛在中北大学成功举办...
  6. 六种常见的平面设计构图技巧
  7. 2018互联网月饼哪家壕,阿里腾讯网易走着瞧
  8. 关于论文组会的一些思考(其一)
  9. mysql数据库击穿_缓存穿透、击穿、雪崩区别和解决方案
  10. vc.60写c语言,悟空问答如何用VC60编写简单的APP