6

我有一个包含以下方法的嵌套片段:

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 的生命与片段或其他东西有关吗?

提前致谢!

4

2 回答 2

1

在我看来,好像有什么东西挂在AsyncTask. 在现代版本的 AndroidAsyncTask中,除非您指定Executor多线程,否则在单线程上运行。onPreExecute()仍然成功运行,因为它在主线程上运行。但是您永远不会看到doInBackground第二次,因为单个后台线程仍然挂在第一次调用中。您需要检查 的内容LocalKeekLauncherFragment.setFragment(fragment)以查看导致挂起的原因。

于 2013-08-21T22:35:59.753 回答
0

似乎 doInBackground 线程可能第二次崩溃了。它不能从第一次尝试中保持卡住,因为 onPostExecute 被调用,这只有在 doInBackground 成功返回值时才有可能。

于 2017-06-13T08:56:01.547 回答