我有一个嵌套的片段,其中包含以下方法:
public void onSave() {
if (getActivity() == null || view == null) return;
if (file != null && file.exists()) {
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
Log.d("log", "onPreExecute of save ex");
}
@Override
protected Void doInBackground(Void... params) {
Log.d("log", "doInBackground of save ex");
//DO SOMETHING
return null;
}
protected void onPostExecute(Void result) {
BaseFragment fragment = new LocalListFragment();
((LocalLauncherFragment)(LocalEditFragment.this.getParentFragment())).setFragment(fragment);
Log.d("log", "end of save ex");
};
}.execute();
} else {
showAlert();
}
}
我的问题是,如果我第一次调用此方法,则它会执行到onPostExecute()。但是如果我转到其他片段并新打开此片段(通过创建一个新的片段对象并将其替换),那么只有onPreExecute()会被执行。为什么这个asyncTask对象第二次不能正常执行呢?
有趣的是,如果我使用executeOnExecutor(),则第二次就可以正常工作。但是为什么execute()无效呢?AsyncTask的生命周期是否与片段绑定或者其他原因呢?
提前感谢!
executeOnExecutor
时,我猜想你正在使用的是THREAD_POOL_EXECUTOR
而不是SERIAL_EXECUTOR
,对吧?尝试一下使用SERIAL_EXECUTOR
,我敢打赌你会得到相同的(不希望出现的)结果。 - kabuko