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