【问题标题】:Android Kotlin Retrofit, wait for response outside suspendAndroid Kotlin Retrofit,等待外挂响应
【发布时间】: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,它会等待它,当收到结果后你可以进一步处理它。

标签: android kotlin retrofit2


【解决方案1】:

Retrofit 的Call 有一个execute() 方法,如果您可以阻止调用线程并且需要同步获取响应,则可以调用该方法。请记住,您可能需要禁用 StrictMode,这会默认抛出 NetworkOnMainThreadException

【讨论】:

  • 不敢相信我错过了,我以为 execute() 异步发送请求,谢谢!
猜你喜欢
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2020-02-24
  • 2019-07-29
  • 2018-08-26
  • 2017-06-28
  • 2018-08-01
相关资源
最近更新 更多