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