2014-12-07 110 views

回答

55

相当多的不同!

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

OkHttp的异步是有很多原因大大优于:

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

所以如果可以的话,请使用Call.enqueue

1

没什么。 OKHttp异步是OKHttp API驱动的。所以只要你把所有平台的瓶子捆绑在一起,你应该很好。 AsyncTask是Android做事的方式。

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

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

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