【发布时间】:2014-12-07 08:08:16
【问题描述】:
OKHttp 同时支持synchronous and asynchronous api。 如果我想发出异步请求,我可以:
- 使用 AsyncTask,并发出 OKhttp 同步 api。
- 发出 OKhttp 异步 api。
这两个选项有什么区别?哪个更好?
【问题讨论】:
标签: android android-asynctask network-programming okhttp
OKHttp 同时支持synchronous and asynchronous api。 如果我想发出异步请求,我可以:
这两个选项有什么区别?哪个更好?
【问题讨论】:
标签: android android-asynctask network-programming okhttp
差别很大!
对 HTTP 请求使用 AsyncTask 几乎是您在 Android 上可以做的最糟糕的事情之一。它充满了最好无条件避免的问题和陷阱。例如,您不能在执行期间取消请求。使用AsyncTask 的模式通常也会泄露对Activity 的引用,这是Android 开发的一大罪过。
OkHttp 的 async 非常优越,原因有很多:
Callback 的引用将被释放并且永远不会被调用。此外,如果请求还没有开始,它永远不会被执行。如果您使用的是 HTTP/2 或 SPDY,我们实际上可以取消中间请求以节省带宽和功率。Activity 中提出的每个请求都可以使用Activity 实例进行标记。然后在onPause 或onStop 中,您可以取消所有带有Activity 实例标记的请求。Call 机制,这比阻塞版本更有效。因此,如果可以,请使用Call.enqueue!
【讨论】:
AsyncTask可以取消(来自stackoverflow.com/questions/4748964/…),但我还是投了你的票。
没什么。 OKHttp async 是由 OKHttp API 驱动的。因此,只要您将所有平台的罐子捆绑在一起,您就应该很好。 AsyncTask 是 Android 的做事方式。
但是,由于 Honeycomb Async 任务按顺序而不是并行运行任务。这意味着尽管 AsyncTask 的 execute 方法跨越了一个新线程,该线程将您的作业从 UI 线程运行,但发送到一个 AsyncTask 的所有任务都在同一个跨越线程中运行。
因此,对于提交的 3 个任务,您不会获得 3 个线程,它们都在单个跨线程上按顺序运行。使用 OKHttp,您可以使用回调和异步 GET 和 POST 实现真正的并行性。
虽然您也可以在 AsyncTask 方法中实现真正的并行性(检查 AsyncTask 中重载的执行方法),但默认的 Android 行为不会这样做。
【讨论】: