【发布时间】:2018-06-17 11:32:20
【问题描述】:
我真的到处都在搜索这个,我可以同时发出同步和异步数据请求,但我实际上无法理解哪个是异步的?什么是同步的?
【问题讨论】:
我真的到处都在搜索这个,我可以同时发出同步和异步数据请求,但我实际上无法理解哪个是异步的?什么是同步的?
【问题讨论】:
call.execute() 在当前线程上运行请求。
call.enqueue(callback) 在后台线程上运行请求,并在当前线程上运行回调。
您通常不想在主线程上运行call.execute(),因为它会崩溃,但您也不想在后台线程上运行call.enqueue()。
【讨论】:
call.execute() 在线程池/执行程序/IntentService 上有意义。
当你异步时,它意味着不在前台(它在完成给定任务时不会阻塞用户界面),另一方面同步意味着在前台,而你的应用程序在同一个线程中执行 UI 消耗。
在您的情况下(通过改造或任何其他 REST api 发出 REST 请求),您不得在该前台发出请求,而必须在后台线程中发出。
在改造的情况下,您可以通过以下方法提出请求:
call.execute() // works in the foreground.
call.enqueue() // works in the background.
所以你有两个选择:要么直接调用 call.enqueue,要么你可以使用 call.execute 但用服务包装(我的意思是你必须自己处理后台工作)。
【讨论】:
execute 是同步的。与 UI 线程无关:square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html
通过定义返回类型来声明同步请求。同步方法在主线程上执行。这意味着在请求执行期间 UI 会阻塞,并且在此期间无法进行交互。在调用对象上使用 .execute() 方法将执行同步请求。反序列化的响应正文可通过响应对象上的 .body() 方法获得。
异步请求没有返回类型。相反,定义的方法需要一个类型化的回调作为最后一个方法参数。使用异步请求强制您使用它的两个回调方法实现回调:成功和失败。从服务类调用异步 getTasks() 方法时,您必须实现新的 Callback 并定义请求完成后应执行的操作。
【讨论】:
enqueue?
Retrofit 是适用于 Android 和 Java 的类型安全 HTTP 客户端。我强烈建议在任何其他库上使用它。
你了解什么是sync和async调用,或者什么是blocking和non-blocking调用?
要回答您的问题,您在 Android 上执行的任何 api 调用或任何繁重或耗时的任务都应该是非阻塞(异步),因为它不应阻塞 Android 中的主线程或 UI 线程。
请阅读本文了解更多
https://developer.android.com/guide/components/processes-and-threads.html
【讨论】: