首页 文章

Android匿名类装载机泄漏安全吗?

提问于
浏览
4

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

所以使用Loaders的解决方案,其生命周期与活动的生命周期无关 .

但是,在他们已经定义了匿名AsyncTaskLoader的情况下怎么样呢 . 在我看来,这个Loader引用了它的外部活动 .

(1)这是否会导致内存泄漏,启动活动无法进行垃圾回收?

此外,Loader的onStartLoading()方法保存对外部活动的成员mLoadingIndicator的引用 .

(2)如果onCreateLoader仅在应用程序第一次启动时被调用,那么这个加载器是否会永远锁定到第一个活动的mLoadingIndicator,忽略来自新活动的视图? (例如配置更改后)

1 回答

  • 1

    但是,在这样的情况下,他们定义了一个匿名的AsyncTaskLoader . 在我看来,这个Loader引用了它的外部活动 .

    是的,它有 .

    (1)这是否会导致内存泄漏,启动活动无法进行垃圾回收?

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

    (2)如果仅在应用程序第一次启动时调用onCreateLoader,那么此加载器是否会永久锁定第一个活动的mLoadingIndicator,忽略新活动的视图? (例如配置更改后)

    onCreateLoader 没有锁定到视图 mLoadingIndicator 正在引用,但它只调用其中一个方法 . 真正重要的是 mLoadingIndicator 在调用 onCreateLoader 时引用的对象 .

    实际上,加载器会锁定外部活动 . 如果配置更改创建了新的加载指示器视图,并且仅在调用 onCreateLoader 时,该方法将使用新视图 .

    示例

    AsyncTaskLoader 可以通过将其包装在_2615627中而引用内存泄漏而引用 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();
            }
        }
    }
    

相关问题