改造同步和异步请求有什么区别?哪个更好,为什么?

时间:2018-01-08 13:17:20

标签: android rest retrofit

我确实在每个地方搜索过这个,我可以同时发出同步和异步数据请求,但我实际上无法理解哪个是异步的?什么与什么同步?

4 个答案:

答案 0 :(得分:10)

call.execute()在当前线程上运行请求。

call.enqueue(callback)在后​​台线程上运行请求,并在当前线程上运行回调。

您通常不希望在主线程上运行call.execute(),因为它会崩溃,但您也不想在后台线程上运行call.enqueue()

答案 1 :(得分:7)

当你异步时,它意味着不在前台(当它完成给定任务时它不会阻塞用户界面),另一方面,当你的应用程序在UI消耗的同一个线程中执行事物时,同步意味着在前台。

在您的情况下(通过改造或任何其他REST api发出REST请求),您不能在该前景中进行,并且您必须在后台线程中进行。

在改造的情况下,您可以使用以下方法发出请求:

call.execute() // works in the foreground.
call.enqueue() // works in the background.

所以你可以选择两个:你可以直接调用call.enqueue,也可以使用call.execute但是用服务包装(我的意思是你必须自己处理后台工作)。

答案 2 :(得分:0)

通过定义返回类型声明同步请求。在主线程上执行同步方法。这意味着UI在请求执行期间阻塞,并且在此期间不可能进行交互。在调用对象上使用.execute()方法将执行同步请求。反序列化的响应体可以通过响应对象上的.body()方法获得。

异步请求没有返回类型。相反,定义的方法需要将类型化的回调作为最后一个方法参数。使用异步请求会强制您使用其两种回调方法实现回调:成功和失败。从服务类调用异步getTasks()方法时,必须实现一个新的Callback并定义请求完成后应该执行的操作。

答案 3 :(得分:-2)

Retrofit是适用于Android和Java的类型安全的HTTP客户端。我强烈建议在任何其他库中使用它。

您了解什么是同步异步来电,或阻止非阻止来电?

要回答你的问题,你做的任何api电话或你在Android上做的任何繁重或耗时的任务,它应该是非阻塞(异步),因为它不应该阻止Android中的主线程或UI线程。

请阅读本文以获得更多理解

https://developer.android.com/guide/components/processes-and-threads.html