【问题标题】:Using OKHttp, what is the difference between synchronous request in AsyncTask and OKhttp Asynchronous request?使用OKHttp,AsyncTask中的同步请求和OKhttp异步请求有什么区别?
【发布时间】:2014-12-07 08:08:16
【问题描述】:

OKHttp 同时支持synchronous and asynchronous api。 如果我想发出异步请求,我可以:

  1. 使用 AsyncTask,并发出 OKhttp 同步 api。
  2. 发出 OKhttp 异步 api。

这两个选项有什么区别?哪个更好?

【问题讨论】:

    标签: android android-asynctask network-programming okhttp


    【解决方案1】:

    差别很大!

    对 HTTP 请求使用 AsyncTask 几乎是您在 Android 上可以做的最糟糕的事情之一。它充满了最好无条件避免的问题和陷阱。例如,您不能在执行期间取消请求。使用AsyncTask 的模式通常也会泄露对Activity 的引用,这是Android 开发的一大罪过。

    OkHttp 的 async 非常优越,原因有很多:

    • 它支持本机取消。如果请求正在进行中,则对Callback 的引用将被释放并且永远不会被调用。此外,如果请求还没有开始,它永远不会被执行。如果您使用的是 HTTP/2 或 SPDY,我们实际上可以取消中间请求以节省带宽和功率。
    • 它支持标记多个请求并通过单个方法调用将它们全部取消。这意味着您在Activity 中提出的每个请求都可以使用Activity 实例进行标记。然后在onPauseonStop 中,您可以取消所有带有Activity 实例标记的请求。
    • 如果您使用 HTTP/2 或 SPDY 请求和响应通过单个连接多路复用到远程服务器,并且使用异步 Call 机制,这比阻塞版本更有效。

    因此,如果可以,请使用Call.enqueue

    【讨论】:

    【解决方案2】:

    没什么。 OKHttp async 是由 OKHttp API 驱动的。因此,只要您将所有平台的罐子捆绑在一起,您就应该很好。 AsyncTask 是 Android 的做事方式。

    但是,由于 Honeycomb Async 任务按顺序而不是并行运行任务。这意味着尽管 AsyncTask 的 execute 方法跨越了一个新线程,该线程将您的作业从 UI 线程运行,但发送到一个 AsyncTask 的所有任务都在同一个跨越线程中运行。

    因此,对于提交的 3 个任务,您不会获得 3 个线程,它们都在单个跨线程上按顺序运行。使用 OKHttp,您可以使用回调和异步 GET 和 POST 实现真正的并行性。

    虽然您也可以在 AsyncTask 方法中实现真正的并行性(检查 AsyncTask 中重载的执行方法),但默认的 Android 行为不会这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 2020-03-28
      • 1970-01-01
      • 2019-03-30
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多