簡體   English   中英

Android匿名類加載器泄漏安全嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM