-2

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

在 ICS 上测试应用程序时,我遇到了一个不同的问题。它在 Pre-GingerBread 和 GingerBread 版本的设备上运行良好。它NetworkOnMainThreadException在测试 ICS 设备时抛出,并通过将 HTTP 调用放入AsyncTask.

但是我的问题是我做了 4 到 5 种不同HTTP Url calls的调用,并且调用每个 url 都需要一个 AsyncTask,因为这些 URL 应该一个接一个地同时执行。

如果一个 url 的结果失败,则不应调用下一个 URL,并且应在 UI 上更新。因此,我AsyncTask为每个 URL 调用进行了一次。

我们能否AsyncTasks在一个片段中包含多个片段。AsyncTask截至我的片段类中,我设法拥有最多 3 个。

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

提前致谢。

4

3 回答 3

2

您可以将所有 HTTP 调用集中在一起ASyncTask,并使用publishProgress回调进行报告。当一个失败时,您可以停止该 ASyncTask 并且不会调用其他的。

于 2012-08-10T07:16:01.603 回答
1

应该可以在一个 asyncTask 中逐个检查 URL 并通过以下方式发布进度:

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

于 2012-08-10T07:28:53.123 回答
1

ANetworkOnMainThreadException通常是糟糕代码的标志,它会导致糟糕的用户体验,因为应用程序在运行某种网络活动时会锁定。是的,它(不幸的是)适用于蜂窝之前的设备,但这不是任何人都应该追求的。

为了解决您的问题,我强烈建议您使用单个 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

于 2012-08-10T07:41:08.390 回答