由于NetworkOnMainThreadException,应用程序在ICS版本上运行不正常

时间:2012-08-10 07:03:19

标签: android android-asynctask android-fragments

我开发了一款Android应用程序,它将在几天后上线。

在ICS上测试应用时,我遇到了一个不同的问题。 它在Pre-GingerBread和GingerBread版本设备上运行良好。在测试ICS设备时它会抛出NetworkOnMainThreadException,并设法通过在AsyncTask中放置HTTP调用来删除它。

但我的问题是我正在制作4到5个不同的HTTP Url calls并且调用每个url需要AsyncTask,因为这些URL应该一个接一个地并发执行。

如果一个网址的结果失败,则下一个网址不应该被调用,并且应该在UI上更新。所以我为每个网址调用AsyncTask

我们可以在单个片段中有很多AsyncTasks吗?从我管理到我的片段类中最多3 AsyncTask

如果是这样,我们可以从第一个AsyncTask AsyncTask方法开始执行另一个PostExecute

先谢谢。

3 个答案:

答案 0 :(得分:2)

您可以将所有HTTP呼叫放在一个ASyncTask中,然后使用publishProgress回调进行报告。当一个失败时,你可以停止那个ASyncTask而不会调用其他的。

答案 1 :(得分:1)

应该可以在一个asyncTask中一个接一个地检查URL并通过以下方式发布回来:

http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29

答案 2 :(得分:1)

NetworkOnMainThreadException通常表示代码不佳,并且会导致糟糕的用户体验,因为只要应用程序运行某种网络活动,应用程序就会锁定。是的,(不幸的是)它适用于蜂窝前装置,但它不是任何人都应该使用的。

要解决您的问题,我强烈建议您使用单个AsyncTask并在doInBackground()方法中连续执行所有HTTP调用。对于每个呼叫,检查呼叫是否成功。如果确实如此,那么它只会转到下一个 - 如果失败,你可以return null之后不再进行HTTP调用,而onPostExecute()方法将是自动调用。很简单。

以下是我想到的一个例子:

private class DoNetworkStuff extends AsyncTask<String, Integer, String> {

 protected String doInBackground(String... params) {
     // Do network call
     if (!call.hasSucceeded()) return null;

     // Do next network call
     if (!call.hasSucceeded()) return null; // Check if call succeeded - pseudo code

     // Continue this pattern with all your network calls

     return ""; // If this point is reached, all network calls succeeded
 }

 protected void onPostExecute(String result) {
     if (result != null) {
         // All calls succeeded - celebrate!
     } else {
         // A call failed - clean-up...
     }
 }

}

在执行任何其他操作之前,请查看AsyncTask的文档并了解它。我确信这适用于您的应用:http://developer.android.com/reference/android/os/AsyncTask.html