繁体   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