尽管Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定。假设仅仅是使用少量的几张图片,回收与否关系不大。但是若有大量bitmap须要垃圾回收处理,那必定垃圾回收须要做的次数就很多其它也发生地更频繁,会对系统资源造成负荷。所以,这个时候还是自己试用recycle来释放的比較好。

怎样去使用recycle()方法和何时试用recycle()都是值得考虑的问题。否側,极易出现以下的异常:

05-15 08:31:00.117: E/AndroidRuntime(513): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44c093b8

java执行时异常:试图使用一个已经回收了的图片

仅仅有当你确认你不会在使用这个bitmap的时候,就能够选择调用recycle()方法释放它。

今天在做个小測试的时候,就由于recycle()的调用出现了异常。原因是:

在xml文件里,ImageView有两个方法来设置一张显示的图片:

 android:background="@drawable/aa"
android:src="@drawable/aa"

刚開始,我使用background,然后在程序中,这样设置

                        // 获得ImageView当前显示的图片
Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap(); Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),
bitmap1.getHeight(), matrix, true);
// 假设图片还没有回收,强制回收
if (!bitmap1.isRecycled()) {
bitmap1.recycle();
}
// 依据原始位图和Matrix创建新的图片
imageView.setImageBitmap(bitmap2);

由于imageView.setImageBitmap()方法设置的是相应的src的图片,而不是background。而我却把background的图片给回收了。这样,就导致了异常的发生。

所以改动成例如以下的代码,去调用setBackGround()方法

                       // 获得ImageView当前显示的图片
Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();
Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(),
bitmap1.getHeight(), matrix, true);
// 假设图片还没有回收,强制回收
if (!bitmap1.isRecycled()) {
bitmap1.recycle();
}
// 依据原始位图和Matrix创建新的图片
//imageView.setImageBitmap(bitmap2);
imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));

所以,一定要注意ImageView图片的来源问题,然后在进行对应的recycle。

一、Bitmap的recycle问题的更多相关文章

  1. 是否需要主动调用Bitmap的recycle方法

    一个Bitmap使用完后,是只需要等它成为垃圾后让GC去回收,还是应该主动调用recycle方法呢?或者说,主动调用recycle方法是否有好处,是否能马上回收内存呢? 带着这个问题来看源码(我看的4 ...

  2. Bitmap的recycle问题

        虽然Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定.如果只是使用少量的几张图片,回收与否关系不大.可是若有大量bitmap需要垃圾回收处理,那必然垃 ...

  3. Bitmap recycle()

    Bitmap调用recycle? When? Bitmap有一个recycle方法,意思非常easy,回收Bitmap的空间. Q 1: Bitmap是否有调用recycle方法的必要性? A: 嵌入 ...

  4. java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法

    1 BitmapFactory.decodeFile(imageFile); 用BitmapFactory解码一张图片时,有时会遇到该错误.这往往是由于图片过大造成的.要想正常使用,则需要分配更少的内 ...

  5. 【转】Android开发之Bitmap的内存优化详解

    本文来源:转载自: http://mobile.51cto.com/abased-410796.htm 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitma ...

  6. 解析Android开发优化之:对Bitmap的内存优化详解

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  7. BitMap 内存使用优化

    在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图 ...

  8. Android开发优化之——对Bitmap的内存优化

    http://blog.csdn.net/arui319/article/details/7953690 在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitm ...

  9. 如何使用Palette提取Bitmap的颜色

    5.X提出了color palette 的概念,能够让主题动态的去适应当前的页面色调,让整个app色调看起来比较和谐统一 那么如何使用Palette呢,必不可少,我们需要在Android studio ...

随机推荐

  1. PHP实现简易的模板引擎

    PHP实现简易的模板引擎 1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Mode ...

  2. Shell之test

    test命令用法.功能:检查文件和比较值 1)判断表达式 if test (表达式为真) if test !表达式为假 test 表达式1 –a 表达式2                  两个表达式 ...

  3. iOS: 学习笔记, 使用performSelectorOnMainThread及时刷新UIImageView

    在iOS中, 界面刷新在主线程中进行, 这导致NSURLSession远程下载图片使用UIImageView直接设置Image并不能及时刷新界面. 下面的代码演示了如何使用 performSelect ...

  4. JMX示例

    HelloJMXMBean.java package jmx; /** * Created by george on 14-8-21. */ public interface HelloJMXMBea ...

  5. CMD 模块定义规范

    在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规则. 在 CMD 规范 ...

  6. CTSC模拟题 树上的路径

    Description 给定一棵\(N\)个结点的树,结点用正整数\(1 \dots N\)编号,每条边有一个正整数权值.用\(d(a, b)\)表示从结点\(a\)到结点\(b\)路径上经过边的权值 ...

  7. Nodejs异步

    http://cnodejs.org/topic/4f16442ccae1f4aa2700113b http://cnodejs.org/topic/4f16442ccae1f4aa27001123 ...

  8. JVM参数配置大全

    前阵子遇到几个面试题都是关于对Java内存控制的,因此从网上找到这篇文章,希望自己对Java的内存分配有重新的认识 /usr/local/jdk/bin/java -Dresin.home=/usr/ ...

  9. SparkSQL配置和使用初探

    1.环境 OS:Red Hat Enterprise Linux Server release 6.4 (Santiago) Hadoop:Hadoop 2.4.1 Hive:0.11.0 JDK:1 ...

  10. 导航软件 CH Round #57 - Story of the OI Class

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/导航软件 题解:刚开始看见题目, ...