Я прочитал, что выполнение AsyncTask
в Activity
имеет тот недостаток, что задача не очень хорошо справляться с изменениями конфигурации, так как AsyncTask
«s жизненный цикл не привязан на Activity
жизненного цикла. Следовательно, если задача должна обновить пользовательский интерфейс Activity, но в то же время Activity
был уничтожен из-за изменения конфигурации, AsyncTask
ничего не знает о недавно созданном Activity
, и поэтому у него нет никаких шансов его обновить. Это также может привести к утечке памяти.Выполнить AsyncTask в обезглавленный Фрагмент
Обходное решение предложило использовать безголовый Fragment
(Fragment
без интерфейса), просто для того, чтобы выполнить 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
является View
, который принадлежит к Activity
и устанавливается в Fragment
быть обновлен. Я думаю, что someActivityView
не сохраняется в случае изменения конфигурации, а Activity
создан снова, следовательно, в чем преимущество использования безголового Fragment
в этом случае?
Нельзя обновлять вид деятельности напрямую. Создайте обратный вызов и реализуйте его в действии. Теперь во фрагменте используйте getActivity() и отбросьте его для обратного вызова и используйте его. –