2012-12-10 51 views
1

我對Java環境中的軟引用和弱引用很鄙視。我也讀了一些關於這兩個主題。總而言之,弱引用正如名稱所示,對對象的引用很弱。這意味着這個對象的引用很容易被GC收集。弱引用是創建這樣:軟引用和弱引用

WeakReference<SomeOtherRef> weakReference = new WeakReference(someOtherRef); 

在另一方面軟引用將堅持圍繞更長的時間比弱引用。所以我的問題是:

在我的申請,我有一個ListView自定義適配器該類將處理所有的基本ListView的東西,處理點擊等。當用戶點擊關閉我的列表中的項目,一會的AsyncTask開始。

convertView.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       LoadCase loadCase = new LoadCase(position, holder); 
       loadCase.execute(""); 

      } 
     }); 

現在我不顯示任何progressDialog,原因之一。 context對象。我的問題是,將初始化CustomAdapter的Activity包含許多對象,並且我必須通過參考Activity Context才能顯示ProgressDialog,這個會導致內存泄漏,是的,我試過了。應用弱/軟參考來處理這個問題是否安全? A WeakReference可能在某個時候爲空......當我嘗試初始化我的ProgressDialog時,這將導致NullPointerException

+1

我不認爲你需要WeakReferences或類似的東西來對話或UI代碼等。這些已知的生命週期,應該像這樣管理。通常你使用WeakReferences來實現懶惰的初始化緩存等等。 –

+0

使用正常的強參考代替。 –

+0

@NeilWightman使用普通引用會阻止GC在活動被破壞時收集它們(例如對於方向更改)。 – Pablo

回答

1

是的,在這裏使用WeakReference是個好主意,因爲活動可能會被破壞。每次你想使用它來避免NullPointerException時,你必須檢查它是否爲空。如果它爲空,則意味着該活動已被破壞,因此通常沒有意義顯示ProgressDialog

當然,活動可能會被破壞和重新創建(例如,因爲方向改變)。如果AsyncTask需要很長時間,則可能會出現進度條不再顯示的問題。但是這裏的問題會使用一個AsyncTask來完成一項長期任務,它們只能用於短期任務。

另外,請記住,如果您將AsyncTask作爲Activity類中的內部類繼承,它將對該活動有強烈的參考,因此使用WeakReference將毫無用處。

+0

感謝您的完美回答。 AsyncTask作業只是從SQLite數據庫加載兩個BitMaps。這需要大約1.5 - 2.0秒。 –