I wrote a simple test to see the lifecycle about the AsyncTask
in a retained Fragment
.
It can confirm that @Alex Lockwood's answer is true.
So it's safe to say the AsyncTask
in a retained Fragment
is the best practice. And Google should put this approach into their official documents.
public class RecordDataFragment extends Fragment {
public static boolean detach = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
Timber.d("retain, onAttach");
detach = false;
}
@Override
public void onDetach() {
super.onDetach();
Timber.d("retain, onDetach");
detach = true;
}
public static class TestTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... username) {
Timber.d("retain, looping.");
while(!detach){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Timber.d("retain, exit looping.");
return null;
}
protected void onPostExecute(Void nothing) {
Timber.d("retain, onPostExecute");
}
}
}
public class RecordFragment extends Fragment {
static boolean called = false;
@Override
public void onResume() {
super.onResume();
Timber.d("retain, onResume");
if(!called) {
new RecordDataFragment.TestTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
called = true;
}
}
}
2019-11-22 12:28:55.503 D/RecordDataFragment: retain, onAttach
2019-11-22 12:32:00.263 D/RecordFragment: retain, onViewStateRestored
2019-11-22 12:32:03.538 D/RecordFragment: retain, onResume
2019-11-22 12:32:03.544 D/RecordDataFragment$TestTask: retain, looping.
2019-11-22 12:32:07.273 D/RecordDataFragment: retain, onDetach
2019-11-22 12:32:07.297 D/RecordDataFragment$TestTask: retain, exit looping.
2019-11-22 12:32:07.403 D/RecordFragment: retain, onDestroy
2019-11-22 12:32:07.566 D/RecordDataFragment: retain, onAttach
2019-11-22 12:32:08.621 D/RecordFragment: retain, onViewStateRestored
2019-11-22 12:32:08.870 D/RecordFragment: retain, onResume
2019-11-22 12:32:09.663 D/RecordDataFragment$TestTask: retain, onPostExecute