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