2014-09-01 33 views
-1

我的應用程序的行爲運行在容器活動上,其上有不同的片段。現在在這些片段中,我執行異步任務以從Web API檢索數據。當異步任務尚未完成時,我遇到了一個問題,並且我試圖切換片段,這會導致錯誤。我得到了錯誤的邏輯,因爲任務完成後,它會去執行onPostExecute()執行任務後的其他UI相關的功能和它執行的片段現在已經消失,現在有一個新的片段。有沒有辦法解決這個問題?根據研究,我已經爲片段包含了setRetainInstance(true),但仍然存在錯誤。asnycTask正在運行時切換片段導致錯誤

這裏是我切換片段:

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 
    } 

} 

我通常用空在我的參數,因爲我經常使用類/全局變量,所以我可以在任何地方訪問這些在我的班級裏。

UPDATE:

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 
+0

發佈錯誤。 – 2014-09-01 07:02:02

+0

請將您的logcat錯誤與一些足夠的代碼一起發佈。你沒有顯示出必要的部分 – GrIsHu 2014-09-01 07:05:07

+0

查看我更新的帖子。 – ljpv14 2014-09-01 07:09:34

回答

0

我能想到的兩個選項:

  1. 中止執行的AsyncTask當您切換片段。

  2. onPostExecute()中,存儲數據的方式稍後可以在片段再次顯示時檢索。例如,您可以將數據放入SQLite數據庫或SharedPreferences中。

+0

行號115.的代碼嗯,這可能是一個不錯的選擇。我如何中止運行asyncTasks?我正在考慮在切換片段時中止每個正在運行的異步任務。 – ljpv14 2014-09-01 07:10:17

0

我有同樣的錯誤。當我們移出片段時,我停止了異步任務。

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