2012-09-21 53 views
4

这个问题与Do we have to explicitly recycle the bitmap if we don't need it?。相关。如何在不需要的情况下销毁ImageView中的drawable?

有一个ImageView有一个drawable,当用户点击一个按钮时,它会为ImageView分配一个新的drawable。

我们是否必须销毁属于ImageView的旧drawable,以及如何?

Drawable oriDrawable = imageView.getDrawable() 

// set callback to null 
oriDrawable.setCallback(null); 

// get the bitmap and recycle it 
((BitmapDrawable)oriDrawable).getBitmap().recycle(); 

上面的代码是否正确?什么是最好的解决方案?

回答

3

这只是一个普遍的问题,或者您的内存不足?除非你真的有问题,否则我不会进行这种优化。

一般情况下,如果您从可扩展文件夹中加载位图不是很大(大于兆字节),那么您应该不会遇到问题。

首先,您需要确保您正在加载的资产最适合显示它们的位置,例如,如果您显示图像的区域的大小为1024 x 1024,则将ImageView设置为图像无任何意义大小为64x64。

打破位图预算通常是由于加载未知大小的图像或者仅仅是像上面描述的那样只是简单地获取图像大小而导致的,经常交换ImageView通常不会给您带来最佳尺寸图像的问题。

有一个在Android的训练了一大篇,涵盖装载位图的最佳http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

希望帮助

+1

我确实有OutOfMemoryException,并已将其作为URL的建议进行了修复。但是我确定如果我需要尽可能多地回收未使用的drawable,或者当我分配一个新的drawable时它会自动销毁。 – Freewind

+1

我会首先尝试查看您是否因无法回收而出现问题,因为这些问题将通过GC进行回收。只要确保没有对drawable或bitmaps的额外引用使其符合GC标准。 –

11

你可以尝试使用类似:

Drawable drawable = imageView.getDrawable(); 
if (drawable instanceof BitmapDrawable) { 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; 
    Bitmap bitmap = bitmapDrawable.getBitmap(); 
    bitmap.recycle(); 
} 

哪里imageView是你ImageView

原始答案here

+0

其实这不正是你有什么建议 – Blackbelt

+0

@blackbelt我不知道你这是 –

+0

是什么意思谢谢。而且我不确定我们是否必须尽可能多地回收大绘图?如果是的话,为什么不提供一个'回收'方法来绘制? – Freewind

相关问题