2012-11-13 63 views
1

,並將其分配給一個變量:Android的創建對象和內存

Obj obj1 = null; 
obj1 = myFunction(params); 

(這裏myFunction創建一個複雜的對象)

,我稍後重新分配變量:

obj1 = myFunction(otherparams); 

在那一刻發生內存泄漏,因爲我沒有銷燬先前的對象?

這是真實的情況:

Bitmap bmp; 
bmp = drawMyBitmap(3); 
//... some code 
bmp = drawMyBitmap(4); 

將內存泄漏發生在這裏?

五言中,我知道我必須調用bmp.recycle,但我不能這樣做,因爲真正的代碼如下:

Bitmap bmp; 
bmp = drawMyBitmap(3); 
imageView.setImageBitmap(bmp); 
//... some code 
// if I try to do recycle here - I receive java.lang.IllegalArgumentException: Cannot draw recycled bitmaps 
// But I need to recreate bitmap every some minutes 
bmp = drawMyBitmap(4); 
imageView.setImageBitmap(bmp); 

所以,我怎麼能回收的位圖和避免內存泄漏?

+2

爲什麼不創建一個臨時變量來保存前一個位圖,並且在新的setImageBitmap調用之後,您是否回收了temp變量? (可能是因爲Bitmap不再繪製)或者真正的代碼太複雜了? – Astrorvald

+0

請解釋....我每次都得到信息。之後,我繪製位圖並將此位圖設置爲ImageView。我想用Rotate事件顯示這個位圖(因爲你知道它重新創建Activity) - 所以位圖將是靜態的。 – klvd

+0

我不認爲這應該已經關閉。我編輯了這個問題,試圖讓它更清楚。 –

回答

0

在第一種情況下,您將釋放第一個對象的引用,以便垃圾回收器將其銷燬,並由於新引用而使第二個對象保留在內存中。

在第二種情況下,如果您將位圖設置爲ImageView,則無法回收它們,因爲該視圖將不具有用於繪製圖像的位圖,並且會向您返回位圖循環異常,因此您不是「泄漏「到很多內存中,在內存上保留2位圖像。

嘗試使用位圖選項來創建它們以優化您的內存通話。

+0

「你將釋放第一個對象的引用」 - 我不能....因爲我需要Bitmap.release()....但是當我嘗試它時,我捕獲java.lang.IllegalArgumentException – klvd

1

據我所知,你的問題只是你不能回收你的位圖,因爲它的使用。 這是很幼稚的,所以也許這是錯的,但做到這一點:

imageView.setImageBitmap(bmp); 
//... some code 
Bitmap tmp = bmp; 
bmp = drawMyBitmap(4); 
imageView.setImageBitmap(bmp); 
tmp.recycle(); // As it's not anymore referenced by the ImageView, you can recycle the Bitmap safely 

我沒有測試它。給予反饋。

+0

謝謝!我完全忘記了這種方法。工作正常。 – klvd

0
Bitmap bmp; 
bmp = drawMyBitmap(3); 
imageView.setImageBitmap(bmp); 
//... some code 
// if I try to do recycle here - I receive java.lang.IllegalArgumentException: Cannot draw recycled bitmaps 
// But I need to recreate bitmap every some minutes 
Bitmap temp = bmp; //try this 
bmp = drawMyBitmap(4); 
imageView.setImageBitmap(bmp); 
temp.recycle(); 
+0

是的,這是正確的方式 - 我問它的Astrorvald職位。但在你的答案temp.recycle();必須在imageView.setImageBitmap(bmp)後面; – klvd

+0

是的你是對的。我改變它。 –