2012-09-21 48 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

相關問題