Android Kotlin Retrofit,等待挂起外的响应
Android Kotlin Retrofit, wait for response outside suspend
我遇到了一种情况,我需要调用一个端点,并在继续流程之前等待响应
遗憾的是,我无法创建函数 'suspend',因为它需要大量重构,我更愿意 'hack' 这一次
我试过等待事件信号,等待一个值,将 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()
}
Retrofit 的 Call
有一个 execute()
方法,如果您不介意阻塞调用线程并且需要同步获取响应,则可以调用该方法。请记住,您可能需要禁用 StrictMode
,默认情况下会抛出 NetworkOnMainThreadException
。
我遇到了一种情况,我需要调用一个端点,并在继续流程之前等待响应
遗憾的是,我无法创建函数 'suspend',因为它需要大量重构,我更愿意 'hack' 这一次
我试过等待事件信号,等待一个值,将 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()
}
Retrofit 的 Call
有一个 execute()
方法,如果您不介意阻塞调用线程并且需要同步获取响应,则可以调用该方法。请记住,您可能需要禁用 StrictMode
,默认情况下会抛出 NetworkOnMainThreadException
。