zoukankan      html  css  js  c++  java
  • Bitmap的recycle问题

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

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

    [java] view plaincopy
    1. 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有两个方法来设置一张显示的图片:

    [java] view plaincopy
    1. android:background="@drawable/aa"  
    2. android:src="@drawable/aa"  

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

    [java] view plaincopy
    1.                      // 获得ImageView当前显示的图片  
    2. Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
    3.   
    4. Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 00, bitmap1.getWidth(),  
    5.         bitmap1.getHeight(), matrix, true);  
    6. // 如果图片还没有回收,强制回收  
    7. if (!bitmap1.isRecycled()) {  
    8.     bitmap1.recycle();  
    9. }  
    10. // 根据原始位图和Matrix创建新的图片  
    11. imageView.setImageBitmap(bitmap2);  

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

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

    [java] view plaincopy
    1.                     // 获得ImageView当前显示的图片  
    2. Bitmap bitmap1 = ((BitmapDrawable) imageView.getBackground()).getBitmap();  
    3. Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 00, bitmap1.getWidth(),  
    4.         bitmap1.getHeight(), matrix, true);  
    5. // 如果图片还没有回收,强制回收  
    6. if (!bitmap1.isRecycled()) {  
    7.     bitmap1.recycle();  
    8. }  
    9. // 根据原始位图和Matrix创建新的图片  
    10. //imageView.setImageBitmap(bitmap2);  
    11. imageView.setBackgroundDrawable(new BitmapDrawable(bitmap2));  

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


  • 相关阅读:
    操作系统相关知识点
    const define static extern
    Openstack neutron学习
    TensorFlow_Faster_RCNN中demo.py的运行(CPU Only)
    研一前的暑假,深度学习初体验
    List.remove()的使用注意
    iOS开发之多线程(NSThread、NSOperation、GCD)
    PS 滤镜算法原理——碎片效果
    【翻译】ExtJS vs AngularJS
    【翻译】在Ext JS 5应用程序中如何使用路由
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879959.html
Copyright © 2011-2022 走看看