Android内存管理试验——浅谈ImageView的Bitmap的使用

【android开发-07】android中ImageView的用法介绍 android中ImageView使用drawable和bitmap方式的代码参考例子 阅读详情

转自:http://blog.youkuaiyun.com/ztp800201/article/details/16830191


今天在项目中碰到了史无前例的内存泄漏问题,在大量使用Bitmap的Activity的中概率性出现如下错误:

07-13 13:17:20.534: ERROR/AndroidRuntime(5161): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
也就是OOM内存溢出的问题。

在 Java中,JavaVM拥有自动管理内存的功能,其中就有鼎鼎大名的System.GC();这个东东。Java的GC能够进行垃圾回收,但是这不是 C/C++,你并不知道它什么时候能够回收,甚至你主动告诉VM“我要释放这块内存”也无济于事,因为它也就是无精打采的告诉你“知道了”。仅次而已。不 要迷信System.GC(),GC真的是个传说。

话又说过来了,那有自动回收这个功能就没有什么必要了,反正又不听使唤。这就是Java高级的一个体现,它不会让你有权利操作内存的,它认为这是危险的操作。所以Java写久了的人就会忘记了C++中这个东东:

delete

对,这个关键字在Java中已经不存在了,所以你就会发现new成了孤家寡人。

我们经常看到Java中的这段代码:

Object mObject = new Object();

但是很多时候出现下面代码的机会要远远小于上面:

mObject = null;

其 实这像是个废话,因为对象不用了,自然会被VM回收掉,而且mObject = null;这句话并不会让其内存空间立即释放,所以也就没什么用了。其实不然,像Object mObject = new Object();这种构建新对象的方法叫做强引用(还有软引用、弱引用和薄引用,具体区别请百度),除非它不再被任何人引用,否则它始终存在内存中。实 际上置空这个操作就是在我们可控的范围内尽量减少对一个无用内存的引用数量,从而提高内存回收的优先级,换句话说,它越垃圾,越没用,越会被回收。

说了半天那么和ImageView有什么关系呢?

看如下代码:

ImageView mImageView = (ImageView) findViewById(R.id.imageView1) ;

Bitmap bitmap = Bitmap.createBitmap(BitmapFactory.decodeFile(“/sdcard/test.jpg”));

if(bitmap != null)
mImageView.setImageBitmap(bitmap);

相信用过ImageView的人都用过类似的用法,看上去没什么问题,实际上你会遇到一些麻烦。

我做了个试验,新建一个工程,仅有一个Activity,仅有一个ImageView,仅放入了一个Bitmap。

然后我启动应用,点击返回,再启动应用,再返回……等到了第五回,程序挂掉了,抛出的异常为:

ERROR/AndroidRuntime(5161): java.lang.OutOfMemoryError: bitmap size exceeds VM budget。

Oh Shit!这么简单的代码都会挂掉!

为此我看了一下setImageBitmap()这个方法的源码,发现实际上它内部做了类似指针传递的操作:

public void setImageBitmap(Bitmap bm) {
// if this is used frequently, may handle bitmaps explicitly
// to reduce the intermediate drawable object
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}

public BitmapDrawable(Resources res, Bitmap bitmap) {
this(new BitmapState(bitmap), res);
mBitmapState.mTargetDensity = mTargetDensity;
}

BitmapState(Bitmap bitmap) {
mBitmap = bitmap;
}

看见了吧,它并没有新建Bitmap对象,而是对其进行了引用而已。

所以我们执行完setImageBitmap(bitmap)这个方法后应该执行bitmap = null这个操作,让我们这边的引用断掉。提高其被回收的可能性。随后执行System.gc()方法后,就会在程序销毁时bitmap的内存被释放。

不过我们不能随后执行Bitmap.recycle()这个方法,这会强制收回Bitmap的内存,这样就会让ImageView不会显示任何图片并且报错退出。

但是我们可以这么做,将Bitamp定义为类成员变量,然后重载Activity类的protected void onDestroy()方法,如下:

protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(!bitmap.isRecycled())
bitmap.recycle();
}

这样在程序退出后,ImageView中的Bitmap就会被回收掉,减少内存的浪费。

那究竟这两种方法哪个更好用呢?请持续关注我的试验。

本文属试验性研究,如有不同意见,请留言或联系作者本人:hein@jiangnane.com

注:本文属hein@江南`忆原创,转载请注明出处http://www.jiangnane.com/


第六篇Android--ImageView、Bitmap Android ImageView加载Bitmap 阅读详情

相关推荐

ADS交叉耦合振荡器VCO仿真

本文主要参考视频中如何使用进行ADS交叉耦合振荡器仿真和分析,由于视频中有诸多错误和视频清晰度较低,虽然视频博主及时改正,为了节省学习时间,可以直接参考本文。

qq_32589131的博客 5425

【android 优化】ImageView的Bitmap的使用

原文地址:http://blog.renren.com/share/190558220/7583924873 Android内存管理试验——浅谈ImageView的Bitmap的使用(原创) 来源: 韩玮的日志 今天在项目中碰到了史无前例的内存泄漏问题,在大量使用Bitmap的Activity的中概率性出现如下错误: 07-13 13:17:20.534

代码碎片 1611

老服务器焕新记:在Dell R730上折腾Nvidia K80显卡的完整记录(含Anaconda环境配置)

本文详细记录了在Dell R730服务器上为Nvidia K80计算卡安装驱动、配置CUDA及Anaconda环境的完整过程。文章重点解决了老旧硬件与CentOS 7系统的兼容性问题,提供了从BIOS设置、驱动版本精准匹配到Python机器学习环境搭建的实战指南,旨在帮助读者低成本挖掘旧服务器的GPU计算潜力。

weixin_29197835的博客 503

Android内存优化-方式五:Bitmap类的对象要及时主动释放

Bitmap类的对象要及时主动释放 1.若是成员函数中的临时变量,已经没用的 bitmap 对象要及时调用 recycle() 释放,例如: mBitWallPaper.recycle(); mBitWallPaper = null; System.gc(); 2.Activity中的全局Bitmap对象,需要在onDestroy()中明确释放。 3若执行了ImageView.setImageBi...

yaoming168的专栏 3193

绿盾注册机 使用手册

在很多涉及工程设计的单位(如建筑、模具、电路、广告等),电子图纸的应用极为普遍,而电子图纸的丢失、被盗对企业利益的影响是显而易见的,如果被竞争对手获取,甚至可能造成致命的打击。因此,对于这类企业,电子图纸的保密显得至关重要。绿盾信息安全管理软件充分考虑了电子图纸的各种可能传播途径,制定了针对性的解决方案,从而保证了电子图纸的安全。 我们总结了电子图纸的各种传播途径以及相应的对策,有如下几点:

998

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析

前言:ERA5主要提供DAILY和MONTHLY两大类别数据,其中主要包括气温、降水、压力、风速等。

等待着冬天的风的博客 3万+

2022-02-11 Android ImageView 用setImageURI、setImageBitmap、BitmapDrawable等显示本地绝对路径的图片方法

一、如果ImageView显示app里面的资源文件直接用setBackgroundDrawable或setImageResource。 二、如果是ImageView要显示显示本地绝对路径的图片,有三种方式 1、方式一用:setImageURI dynanic_trace_image.setImageURI(Uri.fromFile(new File("/sdcard/trace_photo.jpg"))); 2、方式二:setImageBitmap String img_path =...

海月汐辰 1万+

用迅为RK3588开发板DIY无人机飞控:从电路设计到PID调参全记录

本文详细记录了使用迅为RK3588开发板DIY无人机飞控的全过程,从硬件选型、PCB设计到实时系统构建和PID调参。RK3588核心板凭借其强大的AI算力和丰富接口,成为高性能无人机控制解决方案的理想选择。文章还分享了视觉导航系统集成和实际飞行测试经验,为硬件爱好者提供实用参考。

weixin_29053577的博客 434

android Bitmap内存优化(一) Bitmap 详解

Bitmap 详解 图片压缩 Android Bitmap内存优化

花不掉泪的博客 3179

【AI知识点】启发式算法(Heuristic Algorithms)

启发式算法(Heuristic Algorithms) 是一种基于经验、直觉和局部优化的求解问题的算法,尤其适用于解决计算复杂度高、规模庞大的问题。它们通过简化问题、局部搜索和快速近似,提供了一种在短时间内获得“足够好”解的途径。虽然启发式算法无法保证全局最优解,但它们在实际应用中广泛使用,特别是在优化问题、任务调度和机器学习等领域。

AI完全体 3032

VTK学习(入门级教程,包括安装和使用)~持续更新中

说明:研究QT+VTK有段时间了,准备把学到的东西分享给大家,这篇博客以VS+QT+VTK为主进行展开学习的。

HXX904的博客 4757

Android 简单笔记

陆续添加1.生成Bitmap一般用BitmapFactory类的静态方法BitmapFactory.Options mOptions;mOptions = new BitmapFactory.Options();mOptions.inSampleSize = 1;mOptions.inTempStorage = new byte[100 * 1024];Bitmap bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(

铁锹在手,天下我有 2342

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷 采购订单,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,并提供在线OJ模拟做题。华为OD机试真题【采购订单】

qq_45776114的博客 3534

Bitmap优化详谈

目录介绍 01.如何计算Bitmap占用内存 1.1 如何计算占用内存 1.2 上面方法计算内存对吗 1.3 一个像素占用多大内存 02.Bitmap常见四种颜色格式 2.1 什么是bitmap 2.2 Android常见是那种 2.3 常见四种颜色格式介绍 2.4 Bitmap到底有几种颜色格式 03.Bitmap压缩技术 3.1...

weixin_34293246的博客 170

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

嵌入式偶发故障排查三把硬尺子:换机、录屏、对照

嵌入式系统中的‘偶发故障’并非随机现象,而是软硬件耦合下可定位的确定性偏差。其本质源于通信链路(如串口)、无线协议(如蓝牙)与固件加载(如烧录)三层交互失稳,表现为时序抖动、连接中断或功能异常。通过变量控制的‘换机法’剥离硬件个体差异,行为可视化的‘手机录屏’捕获协议栈状态跃迁,以及物理层对齐的‘新旧批次对照’验证Flash写入完整性,可系统性构建证据链。这些方法不依赖高端仪器,却能将模糊问题收敛至时间、空间与版本三维坐标,广泛适用于IoT模组、车规MCU及智能穿戴等量产场景。

weixin_33827731的博客 257

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

07.Android之多媒体问题

目录介绍 7.0.0.1 加载bitmap图片的时候需要注意什么?为何bitmap容易造成OOM?如何计算Bitmap占用内存? 7.0.0.2 如何理解recycle释放内存问题?图片加载到内存其实有两部分数据,这是为何? 7.0.0.3 如何在不压缩图片的情况下加载高清大图?加载图的机制是什么,为何不会内存泄漏? 7.0.0.7 L...

weixin_34268753的博客 78

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NVIDIA Apex源码深度审计:从混合精度到FusedAdam的工程实践

混合精度训练是加速深度学习模型的重要技术,其核心挑战在于FP16的有限动态范围会引发梯度下溢。Loss Scaling通过放大损失函数将梯度拉回可表示区间,而Gradient Scaler与优化器step的联动则成为工程实现的关键。NVIDIA Apex作为经典的混合精度扩展库,不仅提供了amp自动精度管理机制,还通过multi_tensor_apply实现了FusedAdam等融合算子,显著降低大量小张量更新时的kernel启动开销。在实际落地中,Apex的工程治理颗粒度、对PyTorch/CUDA版本的

weixin_34405354的博客 290
上一篇: Android中使用Bitmap会出现OutOfMemory的原因(转)
下一篇: Android处理图片OOM的若干方法小结
primer_programer
博客等级 码龄20年 283粉丝 180原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值