gpt4 book ai didi

java - Android 匿名类加载器泄漏安全吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:36:25 25 4
gpt4 key购买 nike

在 Android 开发中,我了解到 AsyncTask定义为非静态嵌套类并不理想,因为当启动任务的 Activity 在任务完成处理之前死亡时,它可能会导致内存泄漏。

所以解决方案要用Loaders ,其生命周期独立于 Activity 的生命周期。

但是,在like this的情况下呢?他们在其中定义了一个匿名的 AsyncTaskLoader。在我看来,这个 Loader 有一个对其外部 Activity 的引用。

(1) 这不会导致内存泄漏,启动的 Activity 无法被垃圾回收吗?

此外,Loader 的 onStartLoading() 方法持有对外部 Activity 的成员 mLoadingIndicator 的引用。

(2) 如果仅在应用程序首次启动时调用 onCreateLoader,此加载程序是否会永远锁定第一个 Activity 的 mLoadingIndicator,而忽略新 Activity 的 View ? (例如配置更改后)

最佳答案

However, what about in a situation like this where they've defined an anonymous AsyncTaskLoader. It looks to me that this Loader has a reference to its outer activity.

是的,它有。

(1) Does this not cause a memory leak, where the starting activity is unable to be garbage collected?

是的,确实如此。如果此 Loader 无限期运行并且比包含 Activity 的时间更长,它可能会阻止上下文的垃圾收集。

(2) If onCreateLoader is only called the first time the application launches, will this loader will forever latch on to that first activity's mLoadingIndicator, ignoring the view from the new activity? (For example after configuration change)

onCreateLoader 不会锁定 mLoadingIndicator 正在引用的 View ,但它只会调用其方法之一。真正重要的是 mLoadingIndicator 在调用 onCreateLoader 时引用的对象。

实际上,加载器锁定了外部 Activity 。如果配置更改创建了一个新的加载指示器 View ,并且只有在 onCreateLoader 被调用时,该方法才会使用新 View 。

例子

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();
}
}
}

关于java - Android 匿名类加载器泄漏安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43454247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com