[英]Android anonymous class Loaders leak safe?
在Android開發中,我了解到將AsyncTask定義為非靜態嵌套類並不理想,因為當啟動任務的Activity在任務完成處理之前死亡時,它可能導致內存泄漏。
因此,可以使用生命周期獨立於活動周期的Loaders的解決方案。
然而,關於在什么情況下這樣的 ,他們已經定義了一個匿名AsyncTaskLoader。 在我看來,此加載程序對其外部活動具有引用。
(1)這不會導致內存泄漏嗎?在這種情況下,啟動活動無法被垃圾回收?
此外,加載程序的onStartLoading()方法保留對外部活動的成員mLoadingIndicator的引用。
(2)如果僅在應用程序首次啟動時調用onCreateLoader,則此加載程序是否會永久性地鎖定到該第一個活動的mLoadingIndicator,而忽略新活動中的視圖? (例如,更改配置后)
但是,在這樣的情況下,他們定義了匿名的AsyncTaskLoader,該怎么辦? 在我看來,此加載程序對其外部活動具有引用。
是的,它有。
(1)這不會導致內存泄漏嗎?在這種情況下,啟動活動無法被垃圾回收?
是的,它確實。 如果此Loader
無限期地運行並且比包含的Activity
更長,則可能會阻止上下文的垃圾回收。
(2)如果僅在應用程序首次啟動時調用onCreateLoader,那么此加載器將永遠鎖定在該第一個活動的mLoadingIndicator上,而忽略新活動中的視圖嗎? (例如,更改配置后)
onCreateLoader
不會鎖定到mLoadingIndicator
所引用的視圖,但是它僅調用其方法之一。 真正重要的是在調用onCreateLoader
mLoadingIndicator
引用的對象。
實際上,加載程序會鎖定外部活動。 如果配置更改創建了新的加載指示器視圖,然后才調用onCreateLoader
,則該方法將使用新視圖。
AsyncTaskLoader
可以通過將Activity
包裝在WeakReference
Activity
而不會導致內存泄漏。
public class MyAsyncTaskLoader extends AsyncTaskLoader<String> {
private final WeakReference<Activity> mActivity;
public MyAsyncTaskLoader(Activity activity) {
super(activity);
mActivity = new WeakReference<>(activity);
}
public doYourThing() {
Activity activity = mActivity.get();
// if activity is destroyed and garbage collected,
// it will be null
if (activity != null) {
activity.getYourView().setWhatever();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.