在普通函数中调用 .enqueue 还是在 kotlin 挂起函数中调用 .execute 更好?
Is it better to call .enqueue in a normal function or .execute in a kotlin suspend function?
这是我已经知道的:
Retrofit有enqueue
函数和execute
函数。 enqueue
函数在不同的(后台)线程上执行,然后 returns 使用回调的响应。 execute
函数在调用线程上执行,returns 直接响应。 enqueue
可以在 UI 线程上调用,而 execute
不应在 UI 线程上调用。
但是我现在想知道,下面两个选项哪个更好
在普通函数中调用enqueue
:
fun makeRequest() {
getCall().enqueue(
object : Callback<ResponseBody> {
override fun onResponse(
call: Call<ResponseBody>,
response: Response<ResponseBody>
) {
if (response.isSuccessful) {
//unsuccessful
}
//successful
}
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
//failed
}
}
)
}
或在后台线程的挂起函数中调用execute
:
suspend fun makeRequest() = withContext(Dispatchers.IO) {
val call = getCall()
try {
val response = call.execute()
if (!response.isSuccessful) {
//unsuccessful
}
//successful
} catch (t: Throwable) {
//failed
}
}
哪一个更好?
协同程序的语法更清晰,所以这是一个加分项。如果您熟悉协程 SupervisorJob,则可以更轻松地取消请求组。除此之外,除了请求使用哪个后台线程外,它们在很大程度上是相同的。但是 Retrofit 已经有了 built-in 协程支持,所以你的第二个版本可以比你拥有的更干净:
suspend fun makeRequest() { // Can be called from any dispatcher
try {
val response = getCall().awaitResponse()
if (!response.isSuccessful) {
//unsuccessful
}
//successful
} catch (t: Throwable) {
//failed
}
}
这是我已经知道的:
Retrofit有enqueue
函数和execute
函数。 enqueue
函数在不同的(后台)线程上执行,然后 returns 使用回调的响应。 execute
函数在调用线程上执行,returns 直接响应。 enqueue
可以在 UI 线程上调用,而 execute
不应在 UI 线程上调用。
但是我现在想知道,下面两个选项哪个更好
在普通函数中调用enqueue
:
fun makeRequest() {
getCall().enqueue(
object : Callback<ResponseBody> {
override fun onResponse(
call: Call<ResponseBody>,
response: Response<ResponseBody>
) {
if (response.isSuccessful) {
//unsuccessful
}
//successful
}
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
//failed
}
}
)
}
或在后台线程的挂起函数中调用execute
:
suspend fun makeRequest() = withContext(Dispatchers.IO) {
val call = getCall()
try {
val response = call.execute()
if (!response.isSuccessful) {
//unsuccessful
}
//successful
} catch (t: Throwable) {
//failed
}
}
哪一个更好?
协同程序的语法更清晰,所以这是一个加分项。如果您熟悉协程 SupervisorJob,则可以更轻松地取消请求组。除此之外,除了请求使用哪个后台线程外,它们在很大程度上是相同的。但是 Retrofit 已经有了 built-in 协程支持,所以你的第二个版本可以比你拥有的更干净:
suspend fun makeRequest() { // Can be called from any dispatcher
try {
val response = getCall().awaitResponse()
if (!response.isSuccessful) {
//unsuccessful
}
//successful
} catch (t: Throwable) {
//failed
}
}