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