【问题标题】:App not working fine on ICS version due to NetworkOnMainThreadException由于 NetworkOnMainThreadException,应用程序在 ICS 版本上无法正常工作
【发布时间】:2012-08-10 07:03:18
【问题描述】:

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

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

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

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

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

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

提前致谢。

【问题讨论】:

  • '同时一个接一个'肯定只能出现在第5维吗?

标签: android android-asynctask android-fragments


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    NetworkOnMainThreadException 通常表示代码不佳,并且会导致糟糕的用户体验,因为应用程序在运行某种网络活动时会锁定。是的,它(不幸的是)适用于 Honeycomb 之前的设备,但这不是任何人都应该使用的。

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

    【讨论】:

    • 首先,不要对所有三个答案发表相同的评论。您可以拥有任意数量的 AsyncTask,但这不是必需的。您需要知道的一切都在我的回答中。
    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 2015-04-17
    • 2019-04-16
    • 2019-04-21
    • 1970-01-01
    • 2017-10-15
    • 2021-10-30
    • 2018-03-08
    相关资源
    最近更新 更多