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

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

我的应用程序的行为在容器活动上运行,容器活动上有不同的片段。现在,在这些片段中,我执行异步任务,以便从WebAPI检索数据。我遇到了一个问题,当异步任务尚未完成时,我尝试切换片段,它会导致错误。我有点理解错误的逻辑,因为任务完成后,它将转到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();
这是我的异步任务的一个示例

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
    }

 }
私有类SomeTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…id){
//TODO自动生成的方法存根
//在这里做一些关于从web api获取数据的逻辑
返回null;
}
受保护的void onPostExecute(void x){
//在这里执行一些UI功能
}
}
我通常在参数上使用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
09-01 14:50:33.764:E/AndroidRuntime(617):致命异常:AsyncTask#2
09-01 14:50:33.764:E/AndroidRuntime(617):java.lang.RuntimeException:执行doInBackground()时出错
09-01 14:50:33.764:E/AndroidRuntime(617):在android.os.AsyncTask$3.done(AsyncTask.java:299)
09-01 14:50:33.764:E/AndroidRuntime(617):位于java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-01 14:50:33.764:E/AndroidRuntime(617):位于java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-01 14:50:33.764:E/AndroidRuntime(617):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-01 14:50:33.764:E/AndroidRuntime(617):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-01 14:50:33.764:E/AndroidRuntime(617):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-01 14:50:33.764:E/AndroidRuntime(617):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-01 14:50:33.764:E/AndroidRuntime(617):在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-01 14:50:33.764:E/AndroidRuntime(617):在java.lang.Thread.run(Thread.java:856)
09-01 14:50:33.764:E/AndroidRuntime(617):由以下原因引起:java.lang.NullPointerException
09-01 14:50:33.764:E/AndroidRuntime(617):在com.nurserversity.com.Helpers.ApiHelper。(ApiHelper.java:49)
09-01 14:50:33.764:E/AndroidRuntime(617):在com.nurserversity.com.DashboardHome$getProductBundleTask.doInBackground(DashboardHome.java:115)
09-01 14:50:33.764:E/AndroidRuntime(617):在com.nurserversity.com.DashboardHome$getProductBundleTask.doInBackground(DashboardHome.java:1)
09-01 14:50:33.764:E/AndroidRuntime(617):在android.os.AsyncTask$2.call(AsyncTask.java:287)
09-01 14:50:33.764:E/AndroidRuntime(617):在java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-01 14:50:33.764:E/AndroidRuntime(617):。。。还有5个

我可以想出两个选择:

  • 切换片段时中止异步任务

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


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

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

    一定要发布logcat错误和一些足够的代码。您没有显示必要的部分请参阅我的更新帖子。显示第115行的代码。对于您的
    DashboardHome$getProductBundleTask.doInBackground(DashboardHome.java:115)
    Hmm,这可能是一个不错的选择。如何中止运行异步任务?我正在考虑在切换片段时中止每个正在运行的异步任务。