解决方案 »

  1.   

    要先判断这个bitmap 是否回收过了。bm.recyle(); 你都回收了,就不能绘制在UI上面了。ImageView需要bitmap的数据内容
      

  2.   

    我回收的是第一个bitmap  imageview里面用的是第二个bitmap 不是同一个呀
      

  3.   

    他需要bitmap对象绘制到UI上,这个对象你回收了 就无法绘制了,其实是一个数据内存数据。你可以看源代码。
    Bitmap
    canvas.drawBitmap(source, srcR, dstR, paint);
      

  4.   

     Bitmap bm = BitmapFactory.decodeResource(res, id);
    Bitmap newBm = Bitmap.createScaledBitmap(bm , 100,100, true);
    我回收的是bm 为何newBm也变成recyled了, 这两个bitmap不是同一个对象啊
      

  5.   

    canvas.drawBitmap(source, srcR, dstR, paint); 这个source就是你传入的Bitmap对象,如果你回收了 系统就会报错。
      

  6.   

    这个我知道, 我想知道的是newBm我没有手动回收它, 为什么变成回收状态了
    也就是说: Bitmap newBm = Bitmap.createScaledBitmap(bm , 100,100, true); 我把bm回收 为什么newBm也跟着回收了?
      

  7.   

    createScaledBitmapCreates a new bitmap, scaled from an existing bitmap, when possible.

    If the specified width and height are the same as the current width and height of the source btimap, the source bitmap is returned and now new bitmap is created.
      

  8.   

    你可以New一个Canvas然后把Bm画上去再保存下,然后再回收Bm。
    你上面的做法是把Bm当做参数传进去,然后,你又回收了这个Bm参数,所以系统给你报了非法参数的异常。
      

  9.   

    代码没错,不过少了一句:
    Bitmap bm = BitmapFactory.decodeResource(res, id);
     Bitmap newBm = Bitmap.createScaledBitmap(bm , 100,100, true);
     bm.recyle();
    mImageView.setImageBitmap(null);//使用之前一定要先把ImageView清空,要不然会出现你所述的异常
     mImageView.setImageBitmap(newBm);
      

  10.   

    如果尺寸相同,会直接返回原来的图片。
    你需要检查newBmp和bm是不是同一个图片。
      

  11.   

    难道Bitmap.createScaledBitmap(bm , 100,100, true)这个方法是异步的吗,不然已经执行完了我回收应该没问题呀
      

  12.   

    应该是7楼说的
    The new scaled bitmap or the source bitmap if no scaling is required.
    楼主检查一下创建的和原图片的宽高是否一样,如果一样返回的就是原本的bitmap,不创建新的,bm和newBm引用的是一个bitmap.