Android Kotlin Retrofit,等待暂停外的响应

标签 android kotlin retrofit2

我遇到了一种情况,我需要调用一个端点,并在继续流程之前等待响应

可悲的是,我不能让函数“暂停”,因为它需要大量重构,我更愿意“破解”它一次

我尝试过等待事件信号、等待一个值、使用带有“await()”的 RunBlocking、不起作用,并且等待从不返回(使用 .enqueue() 时收到响应)

我只需要它能正常工作,我不介意 UI 卡住、用户等待或代码难看。 有 2 秒超时,这是我愿意接受的牺牲

我不是 android(或 ios)开发者,所以我很乐意得到任何提示

附上我的代码:

API接口(interface)

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

关于Android Kotlin Retrofit,等待暂停外的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62758427/

相关文章:

android - 如何在 Retrofit 中反序列化 ThreeTen LocalDateTime?

android - 如何使向上按钮返回而不是打开抽屉导航

android - 如何在Android中实现Google钱包和PayPal?

java - 如何用反射实例化内部类?

kotlin - 为什么 'await' 会阻塞 kotlin 中的线程?

json - 通过Retrofit 2将数据存储到Realm中

android - Kotlin 数据类 |添加我自己的变量而不是 JSON 键

java - 带有 URLConnection 和 getInputStream 的 IOException

java - Flutter java.io.File android.app.Activity.getExternalFilesDir(java.lang.String)' 在空对象引用上

android - 从数据库+网络加载数据(Room + Retrofit + RxJava2)