我的应用程序的行为在容器活动上运行,其中包含不同的片段。现在在这些片段中,我执行异步任务,以便从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
答案 0 :(得分:0)
我可以想到两个选择:
切换片段时中止AsyncTask。
在onPostExecute()
中,以稍后再次显示片段时可以检索的方式存储数据。例如,您可以将数据放入SQLite数据库或SharedPreferences。
答案 1 :(得分:0)
我有同样的错误。当我们移出一个片段时,我只是停止了异步任务。
@Override
public void onStop() {
super.onStop();
if(postToServerAsyncTask!=null && postToServerAsyncTask.getStatus()==Status.RUNNING){
postToServerAsyncTask.cancel(true);
}
}