Android Kotlin改装,等待外部响应暂停

Android Kotlin改装,等待外部响应暂停,android,kotlin,retrofit2,Android,Kotlin,Retrofit2,我遇到了这样一种情况:我需要调用一个端点,并在继续流之前等待响应 遗憾的是,我不能让函数“挂起”,因为它需要大量的重构,我更喜欢这次“破解”它 我尝试过等待事件信号、等待值、使用带有“await()”的RunBlocking、non-worked和await-never回击(使用.enqueue()时收到响应) 我所需要的就是这个来工作,我不介意UI冻结,用户等待,或者代码难看。 有2秒的暂停时间,这是我愿意做出的牺牲 我不是安卓(或ios)开发者,所以我很乐意得到任何提示 附上我的代码: AP

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

遗憾的是,我不能让函数“挂起”,因为它需要大量的重构,我更喜欢这次“破解”它

我尝试过等待事件信号、等待值、使用带有“await()”的RunBlocking、non-worked和await-never回击(使用.enqueue()时收到响应)

我所需要的就是这个来工作,我不介意UI冻结,用户等待,或者代码难看。 有2秒的暂停时间,这是我愿意做出的牺牲

我不是安卓(或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)

改型的
调用
有一个方法,如果您对阻塞调用线程没有问题,并且需要同步获得响应,则可以调用该方法。请记住,您可能需要禁用
StrictMode
,默认情况下会抛出
NetworkOnMainThreadException

启动一个新的协同程序,而不是运行阻塞,它将等待它,当收到结果时,您可以进一步处理它。我不敢相信我错过了它,我想执行()异步发送请求,谢谢!
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 {
    val tax = taxForAddressApi.getTaxForAddress(taxRequest).await()
}