【发布时间】:2016-05-16 08:26:00
【问题描述】:
我读过在Activity 中执行AsyncTask 的缺点是任务不能很好地应对配置更改,因为AsyncTask 的生命周期与Activity 生命周期无关。因此,如果任务应该更新 Activity 的 UI,但同时 Activity 由于配置更改而被销毁,则 AsyncTask 不知道新创建的 Activity 的任何内容,因此它没有机会更新它。这也可能导致内存泄漏。
解决方法建议它使用无头Fragment(Fragment 没有 UI),只执行AsyncTask,因为它可以在配置更改后继续存在。不过,我不明白这怎么可能是一种可行的方法,因为Activity 及其观点在任何情况下都被破坏了。示例:
public MyFragment extends Fragment {
private SomeAsync myAsync = new SomeAsync();
private WeakReference<View> someActivityView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public void setActivityView(View View) {
someActivityView = new WeakReference<View>(view);
}
...
class SomeAsync extends AsyncTask<Void, Integer, Object> {
protected Object doInBackground(Void... args) {
...
}
protected void onPostExecute(Object result) {
doUpdate(someActivityView, result);
}
}
}
someActivityView 是属于Activity 的View,它被设置为要更新的Fragment。
我认为someActivityView 不会在配置更改的情况下保留,而Activity 会再次创建,因此在这种情况下使用无头Fragment 有什么好处?
【问题讨论】:
-
您不应该直接更新活动视图。创建一个回调并在活动中实现它。现在在片段中使用 getActivity() 并将其转换为回调并使用它。
标签: android android-fragments android-activity android-asynctask