Android Anonymous类加载器泄漏安全



在Android开发中,我了解到将异步定义为非静态嵌套类的异步是不理想的,因为它可能会在启动任务的活动时会导致内存泄漏已经完成处理。

因此,使用加载器的解决方案,其生命周期与活动的生命周期无关。

但是,在这种情况下,他们定义了匿名asynctaskloader的情况。在我看来,该装载机对其外部活动有参考。

(1(这不会导致内存泄漏,在无法收集起始活动的情况下?

此外,加载程序的OnstartLoading((方法包含对外部活动的成员MloadingIndicator的引用。

(2(如果仅在应用程序启动时首次称为onCreatEloader,那么该加载程序会永远锁定到第一个活动的MloadingIndicator,而忽略了新活动的视图?(例如,在配置更改后(

但是,在这种情况下,他们定义了匿名asynctaskloader的情况。在我看来,该加载程序对其外部活动有参考。

是的,它有。

(1(这不会导致内存泄漏,在无法收集起始活动的情况下?

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

(2(如果仅在应用程序启动时首次称为onCreatEloader,该加载程序是否会永远锁定到第一个活动的MloadingIndicator,而忽略了新活动的视图?(例如,在配置更改后(

onCreateLoader没有锁定在视图mLoadingIndicator上引用,但仅调用其中一种方法。真正重要的是对象mLoadingIndicator指在调用onCreateLoader时。

实际上,装载机锁存到外部活动。如果配置更改创建了新的加载指示灯视图,并且仅调用onCreateLoader,则该方法将使用新视图。

示例

AsyncTaskLoader可以参考Activity,而不会通过将其包裹在WeakReference中而导致内存泄漏。

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

相关内容

  • 没有找到相关文章

最新更新