我有一个包含以下方法的嵌套片段:
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(),那么它是第二次正常工作。但为什么不执行()工作? AsyncTask的生活是否与片段或其他东西联系在一起?
提前致谢!
答案 0 :(得分:1)
听起来像是AsyncTask
中挂着的东西。在现代版本的Android AsyncTask
中运行单个线程,除非您指定一个多线程的Executor
。 onPreExecute()
仍然成功运行,因为它在主线程上运行。你永远不会第二次看到doInBackground
,因为单个后台线程仍然在第一次调用时挂起。您需要检查LocalKeekLauncherFragment.setFragment(fragment)
的内容,看看导致挂起的原因。
答案 1 :(得分:0)
似乎doInBackground线程可能已经崩溃了第二次。因为onPostExecute被调用,所以它不能在第一次尝试时停留,只有当doInBackground成功返回值时才可以这样做。