使用OKHttp,AsyncTask中的同步请求和OKhttp异步请求之间有什么区别?

时间:2014-12-07 08:08:16

标签: android android-asynctask network-programming okhttp

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

  1. 使用AsyncTask,并发出OKhttp synchronous api。
  2. 发出OKhttp异步api。
  3. 这两个选项有什么区别?哪一个更好?

2 个答案:

答案 0 :(得分:60)

相差很多!

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

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

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

如果可以,请使用Call.enqueue

答案 1 :(得分:1)

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

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

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

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