【发布时间】:2020-10-26 17:13:06
【问题描述】:
我遇到了一种情况,我需要调用一个端点,并在继续流程之前等待响应
遗憾的是,我无法让函数“暂停”,因为它需要大量重构,而我更愿意“破解”一次
我尝试过等待事件信号,等待一个值,将 RunBlocking 与 'await()' 一起使用,但未成功,并且 await 永远不会回火(使用 .enqueue() 时收到响应)
我所需要的只是让它工作,我不介意 UI 冻结、用户等待或代码丑陋。 有 2 秒的超时,我愿意为此做出牺牲
我不是 android(或 ios)开发人员,所以我很乐意得到任何提示
附上我的代码:
API 接口
import com.google.gson.annotations.SerializedName
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.POST
interface ITaxForAddressApi {
@POST("/myapi")
fun getTaxForAddress(@Body body: TaxForAddressBodyRequest): Call<TaxRateEntity>
}
data class TaxForAddressBodyRequest(
@SerializedName("address") val address: TaxForAddressBodyAddress
)
data class TaxForAddressBodyAddress(
@SerializedName("streetAddress") val streetAddress: String,
@SerializedName("city") val city: String,
@SerializedName("state") val state: String,
@SerializedName("zip") val zip: String,
@SerializedName("country") val country: String
)
data class TaxRateEntity(@SerializedName("tax") val taxRate: Double)
调用代码:
val addressBody =
TaxForAddressBodyAddress(
shippingAddress.street,
shippingAddress.city,
shippingAddress.state,
shippingAddress.zipCode,
shippingAddress.country
)
val taxRequest = TaxForAddressBodyRequest(addressBody)
val taxApiRequest = taxForAddressApi.getTaxForAddress(taxRequest)
taxApiRequest.enqueue(SafeCallback(object : CallbackResponseListener<TaxRateEntity> {
override fun onSuccess(response: TaxRateEntity) {
'Do Something here'
}
override fun onFailure(t: Throwable) {
'Alert'
}
}))
}
尝试使用 runBlocking(当然使用 try-catch):
runBlocking {
val tax = taxForAddressApi.getTaxForAddress(taxRequest).await()
}
【问题讨论】:
-
启动一个新的协程而不是runBlocking,它会等待它,当收到结果后你可以进一步处理它。