Android AsyncTask - 为什么不执行doInBackground()?

时间:2013-08-21 20:09:53

标签: android android-asynctask fragment

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

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的生活是否与片段或其他东西联系在一起?

提前致谢!

2 个答案:

答案 0 :(得分:1)

听起来像是AsyncTask中挂着的东西。在现代版本的Android AsyncTask中运行单个线程,除非您指定一个多线程的ExecutoronPreExecute()仍然成功运行,因为它在主线程上运行。你永远不会第二次看到doInBackground,因为单个后台线程仍然在第一次调用时挂起。您需要检查LocalKeekLauncherFragment.setFragment(fragment)的内容,看看导致挂起的原因。

答案 1 :(得分:0)

似乎doInBackground线程可能已经崩溃了第二次。因为onPostExecute被调用,所以它不能在第一次尝试时停留,只有当doInBackground成功返回值时才可以这样做。