2010-11-18 35 views
10

泄漏如果我正確地解釋這個article,傳遞活動上下文AsyncTasks是一個潛在的泄漏,因爲活動可能,而該任務仍在運行被破壞。的Android上下文的AsyncTask

你怎麼處理這AsyncTasks不在內部clases,需要對資源的訪問或更新UI?

此外,你怎麼能避免泄漏的情況下,如果你需要引用進度對話框解僱他們?

+0

看[此](http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working/3821998#3821998)。這是關於方向的變化,但是這涉及到安全地保持對活動/上下文的引用。 – 2010-11-18 23:29:46

回答

11

如果我理解正確你的問題:Java的的WeakReference或SoftReference的類是一個非常適合這種類型的情況。它將允許您將上下文傳遞給AsyncTask,而不會阻止GC在必要時釋放上下文。

的GC收集在WeakReferences時比它正在收集SoftReferences時更渴望。而不是

FooTask myFooTask = new FooTask(myContext); 

你的代碼看起來像:

WeakReference<MyContextClass> myWeakContext = new WeakReference<MyContextClass>(myContext); 
FooTask myFooTask = new FooTask(myWeakContext); 

,並在的AsyncTask代替:

myContext.someMethod(); 

你的代碼看起來像:

myWeakContext.get().someMethod(); 
+4

只需確保myWeakContext.get()不返回null,否則您就搞砸了。 – 2013-06-26 18:36:48

+0

如果在任務完成後不嚴格需要執行UI更新,則此功能可用。如果在重新創建活動後需要異步任務的結果,則需要使用其他方法。設置爲保持狀態的無頭碎片可以管理您的任務。 – r1k0 2015-01-19 10:00:22