zoukankan      html  css  js  c++  java
  • ImageView中Bitmap的回收

    直接上代码:

       /**
         * 回收bitmap
         */
        private void recycleBitmap(ImageView iv) {
            if (iv != null && iv.getDrawable() != null) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable) iv.getDrawable();
                iv.setImageDrawable(null);
                if (bitmapDrawable != null) {
                    Bitmap bitmap = bitmapDrawable.getBitmap();
                    if (bitmap != null) {
                        bitmap.recycle();
                    }
    
                }
            }
        }
    

     两点解释:

    1.为什么是setImageDrawable(null)?

       setImageBitmap(Bitmap bitmap)实质上是调用setImageDrawable(Drawable drawable),

       而setImageDrawable(Drawable drawable)最终调用updateDrawable(Drawable d)完成mDrawable的赋值。

    2.为什么不能直接设置bitmap=null?

       Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap对象,只能通过BitmapFactory类的各种静态方法来实例化一个Bitmap.仔细查看BitmapFactory的源代码可以看到,生成Bitmap对象最终都是通过JNI调用方式实现的。所以,加载Bitmap到内存里以后,是包含两部分内存区域的。简单的说,一部分是Java部分的,一部分是C部分的。这个Bitmap对象是由Java部分分配的,不用的时候系统就会自动回收了,但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。所以需要调用recycle()方法来释放C部分的内存。从Bitmap类的源代码也可以看到,recycle()方法里也的确是调用了JNI方法了的。

  • 相关阅读:
    阅读《最后期限》有感(1)
    软件工程课程改进建议
    团队开发第二次冲刺第七天
    返回一个二维整数数组中最大联通子数组的和
    大道至简阅读笔记三
    大道至简阅读笔记二
    大道至简阅读笔记一
    团队冲刺阶段二第十次站立会议
    对软工课程的意见建议
    团队冲刺阶段二第九次站立会议
  • 原文地址:https://www.cnblogs.com/hsji/p/5120061.html
Copyright © 2011-2022 走看看