2014-09-11 116 views
1

在我的每個onDestroy應用程序中,我將這個視圖稱爲視圖,因爲我認爲這是一個最小化OOM異常的好習慣。Android中的代碼解釋

public void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
    view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
     unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
    ((ViewGroup) view).removeAllViews(); 
    } 
} 

的事情是,它不是真正清楚,我什麼

view.getBackground().setCallback(null)究竟。是否足夠讓它像這樣或我應該回收視圖背景的位圖?

回答

1

第一部分 - 爲了解釋setCallback(null)做了什麼,你應該看看「回調」是指什麼。

Drawable.Callback用於動畫繪製drawable時。按照在線文檔:

如果要創建可擴展Drawable的動畫可繪製 ,請執行此接口。在檢索drawable時,使用 setCallback(android.graphics.drawable.Drawable.Callback)來提供 您實現的可繪製接口;它使用此接口來調度和執行動畫更改。

您正在通過設置爲null來阻止任何進一步的動畫回調。這將刪除Drawable將包含在Callback對象中的任何引用。

如果您不刪除這些引用,則可以在解除綁定繪圖時泄漏內存。


第二部分 - 您應該在此調用之後回收您的位圖嗎?是。此調用將刪除活動視圖和drawable之間的鏈接,但不會回收drawable使用的內存。

如果您正在編寫2.3及更低版本,則應該回收位圖。請參見Managing Bitmap Memory

在Android 2.3.3(API等級10)和較低的,使用循環()是 建議。如果您在 應用中顯示大量位圖數據,則可能會遇到OutOfMemoryError錯誤。回收() 方法允許應用程序儘快回收內存。


我看到這個代碼在許多其他問題時,有些討論可能有助於未來的讀者:

+0

我該如何刪除這些引用? – Libathos 2014-09-11 12:12:54

+0

哦,我現在看到了,所以與位圖無關,所以我應該在onDestroy上回收它吧? – Libathos 2014-09-11 12:25:48