在asnycTask运行时切换片段会导致错误

时间:2014-09-01 06:59:27

标签: android android-fragments android-asynctask

我的应用程序的行为在容器活动上运行,其中包含不同的片段。现在在这些片段中,我执行异步任务,以便从Web API检索数据。我遇到了一个问题,当异步任务尚未完成时,我试图切换片段,这会导致错误。我有点得到错误的逻辑,因为在任务完成后,它将转到onPostExecute()以执行其他UI相关的函数,在任务和执行它的片段现在已经消失,现在有一个新的片段。有办法解决这个问题吗?根据研究,我已经为片段包含了setRetainInstance(true)但仍然存在错误。

我在这里切换片段:

Fragment fragment = new Fragment();
fragment.setRetainInstance(true); 
fragment = new MyFragment();
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                       .replace(R.id.main_container, fragment)
                       .commit();

这是我的asyncTask

的示例
private class SomeTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... id) {
        // TODO Auto-generated method stub
        //do some logic here on getting data from web api

        return null;
    }

    protected void onPostExecute(Void x) {
        //do some UI functions here
    }

 }

我通常在我的参数上使用void,因为我经常使用类/全局变量,所以我可以在我的类中的任何地方访问它们。

更新:

Logcat错误:

09-01 14:50:33.764: E/AndroidRuntime(617): FATAL EXCEPTION: AsyncTask #2
09-01 14:50:33.764: E/AndroidRuntime(617): java.lang.RuntimeException: An error occured while executing doInBackground()
09-01 14:50:33.764: E/AndroidRuntime(617):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-01 14:50:33.764: E/AndroidRuntime(617):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.lang.Thread.run(Thread.java:856)
09-01 14:50:33.764: E/AndroidRuntime(617): Caused by: java.lang.NullPointerException
09-01 14:50:33.764: E/AndroidRuntime(617):  at com.nurserversity.com.Helpers.ApiHelper.<init>(ApiHelper.java:49)
09-01 14:50:33.764: E/AndroidRuntime(617):  at com.nurserversity.com.DashboardHome$GetProductBundlesTask.doInBackground(DashboardHome.java:115)
09-01 14:50:33.764: E/AndroidRuntime(617):  at com.nurserversity.com.DashboardHome$GetProductBundlesTask.doInBackground(DashboardHome.java:1)
09-01 14:50:33.764: E/AndroidRuntime(617):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-01 14:50:33.764: E/AndroidRuntime(617):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-01 14:50:33.764: E/AndroidRuntime(617):  ... 5 more

2 个答案:

答案 0 :(得分:0)

我可以想到两个选择:

  1. 切换片段时中止AsyncTask。

  2. onPostExecute()中,以稍后再次显示片段时可以检索的方式存储数据。例如,您可以将数据放入SQLite数据库或SharedPreferences。

答案 1 :(得分:0)

我有同样的错误。当我们移出一个片段时,我只是停止了异步任务。

@Override
    public void onStop() {
        super.onStop();
        if(postToServerAsyncTask!=null && postToServerAsyncTask.getStatus()==Status.RUNNING){
            postToServerAsyncTask.cancel(true);
        }
    }