【问题标题】:Multiple HTTP POST in sequence多个 HTTP POST 顺序
【发布时间】:2014-09-25 05:37:13
【问题描述】:

我有一个未开发的应用程序,我需要依次执行 3 个 HTTP POST。实现这一点的最佳方法是什么?我应该

  1. 使每个 HTTP Post 在它自己的 Async 类中并以菊花链方式连接 Async 类(即从第一个 Async 的 onPostExecute 调用第二个 async)

  2. 将所有 HTTP POST 放入单个 Async 的 doInBcakGround 中。

我知道如何执行 HTTP POST 请求,并且我正在使用 OKHTTP 库。我只是想知道按顺序进行多个 POST 的最佳实践。

干杯

【问题讨论】:

标签: android asynchronous http-post


【解决方案1】:

您的第一种方法会更好并且非常模块化,因为您可以跟踪应用程序中的任何内容。在三个不同的AsyncTask 中,您可以查看在postExceute()AsyncTask 完成的工作(更容易和更精确)和

>>>>>万一应用程序崩溃

那么httpPost 中的哪一个失败了。但是,第二个会使您的代码变得混乱,并且您将无法跟踪获取 Exception 是哪个 httpPost 请求失败(但以直截了当的方式)。


因此,从您的第一个任务的 onPostExecute 启动您的第二个 AsyncTask 将是更好的方法。

也见这里:Calling an AsyncTask from another AsyncTask

【讨论】:

  • 我现在就用这个​​。稍后我可能会回到 Sheetal Suryan 的答案。
【解决方案2】:

1 和 2 方法都使应用 ANR,因此更适合其他方法。

您可以使用 ExecutorService,它使用可能的多个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法进行配置。

线程池解决了两个不同的问题:由于减少了每个任务的调用开销,它们通常在执行大量异步任务时提供改进的性能,并且它们提供了一种限制和管理资源(包括线程)在执行时消耗的方法任务的集合。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,比如完成任务的数量。

这里有更多的deatias http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html

【讨论】:

  • ANR 对于第一种方法?我不这么认为,(如果小心处理)
  • 是的,确实如此,但您的问题是必须进行 3 个 http 调用,此处链接为 anr stackoverflow.com/questions/13053611/…
  • @SheetalSuryan 如果您在主 UI 线程上运行它,您只会得到 ANR,我正在后台线程上执行 HTTP 请求。另外,我对 ExecutorService 做了一些快速阅读。据我所知,只有在你想同时执行时才使用,这是正确的。
  • 仔细阅读您发布的链接.....这里在 OP 问题中不涉及 UI 线程的事情(您发布的链接是处理源自 UI 线程上的 long Running btask 的 ANR)
【解决方案3】:

将所有 HTTP POST 放在单个 Async 的 doInBcakGround 中。

因为您的所有帖子都在一个模块中处理。

没有创建异步任务的开销,而且 GC 可能不会像第一次那样调用那么多。

你不需要检查互联网连接3次你必须检查一次

所有异常处理一次,但在方法 1 中,您必须复制并粘贴所有可能发生的异常处理程序。并始终建议不要重复自己。如果你可以做一些不复制和粘贴代码的事情,那就去做吧。

最后我更喜欢方法 2。

【讨论】:

  • 你不认为在 AsyncTask 中同时调用三个 httpPosts 会是一个开销(我并不是说它不可能)。但即使是这样也不是有效的方法考虑了异常处理的上下文。
  • @Butterflow 欢迎您的回答,但它没有创建 3 个线程的开销。它没有创建 3 个套接字的开销。
  • 创建线程不是开销,但处理异常是.. :)
  • Creating threads is not an overhead 为什么?操作系统必须以不同的方式管理你的线程,操作系统必须提供以不同方式处理它的机制,每个线程有不同的堆栈和不同的programing counter 等等。不创建 3 个套接字有开销吗?
  • 虽然你是对的,但是在实际操作中,大多数时候你会想首先通过知道哪个 httpPost 生成它并以你自己的方式处理它来摆脱异常......单个 AsyncTask 中的 3 个请求是可能的,但同样(根据我的个人经验)不是最好的方法。
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 2017-11-02
  • 1970-01-01
相关资源
最近更新 更多