Android 如何在协同程序中进行同步调用

Android 如何在协同程序中进行同步调用,android,coroutine,kotlin-coroutines,Android,Coroutine,Kotlin Coroutines,我想使我的网络请求同步,因为第二个请求的输入来自第一个请求的输出 override fun onCreate(savedInstanceState: Bundle?) { retrofit1 =Retrofit.Builder() .baseUrl("https://jsonplaceholder.typicode.com/").addConverterFactory(GsonConverterFactory.create()).build() retrofit2 =Retr

我想使我的网络请求同步,因为第二个请求的输入来自第一个请求的输出

override fun onCreate(savedInstanceState: Bundle?) {

retrofit1 =Retrofit.Builder()
        .baseUrl("https://jsonplaceholder.typicode.com/").addConverterFactory(GsonConverterFactory.create()).build()

retrofit2 =Retrofit.Builder()
        .baseUrl("https://samples.openweathermap.org/").addConverterFactory(GsonConverterFactory.create()).build()

button.setOnClickListener { view ->
CoroutineScope(IO).launch {
fakeApiRequest()
}}
在我的fakeapirest()中,我提出了两个网络请求

private suspend fun fakeApiRequest() {
val result1 :Geo?= getResult1FromApi()
val result2: Long? = getResult2FromApi(result1)}
因为这是一个异步调用,所以我在getResult2FromApi(result1)方法中得到了Null指针异常,因为传递的参数为Null

为了解决这个问题,我不得不在第一次通话中增加延迟(1500)

private suspend fun getResult1FromApi(): Geo? {
val service:CallService = retrofit1!!.create(CallService::class.java)
val call = service.getUsers()
call.enqueue(object : Callback<List<User>> {
override fun onResponse(call: Call<List<User>>, response: Response<List<User>>) {
g = users.get(0).address.geo
}
override fun onFailure(call: Call<List<User>>, t: Throwable) {

}
})
delay(1500)
return g
}

-----------------------------------------------------------

private suspend fun getResult2FromApi(result1: Geo?): Long? {
val service2:CallService = retrofit2!!.create(CallService::class.java)
val call2 = service2.getWeather(result1?.lat!!, result1.lng,"b6907d289e10d714a6e88b30761fae22")
call2.enqueue(object : Callback<WeatherData> {
override fun onResponse(call: Call<WeatherData>, response: Response<WeatherData>) {

}
override fun onFailure(call: Call<WeatherData>, t: Throwable) {
}
})
return dt
}
private-suspend-fun getResult1FromApi():Geo?{
val服务:CallService=1!!.create(CallService::class.java)
val call=service.getUsers()
排队(对象:Callback{
覆盖fun onResponse(调用:调用,响应:响应){
g=users.get(0.address.geo)
}
覆盖失效时的乐趣(调用:调用,t:可丢弃){
}
})
延迟(1500)
返回g
}
-----------------------------------------------------------
private suspend fun getResult2FromApi(结果1:Geo?):长?{
val service2:CallService=2!!.create(CallService::class.java)
val call2=service2.getWeather(result1?.lat!!,result1.lng,“b6907d289e10d714a6e88b30761fae22”)
call2.enqueue(对象:Callback{
覆盖fun onResponse(调用:调用,响应:响应){
}
覆盖失效时的乐趣(调用:调用,t:可丢弃){
}
})
返回dt
}

无论如何,我都可以使它同步,这样我就不必经过任何延迟时间。

您没有正确地实现suspendable函数。您必须使用
suspendCoroutine

suspend fun getResult1FromApi(): Geo? = suspendCoroutine { continuation ->
    val service = retrofit1!!.create(CallService::class.java)
    service.getUsers().enqueue(object : Callback<List<User>> {
        override fun onResponse(call: Call<List<User>>, response: Response<List<User>>) {
            continuation.resume(response.result.getOrNull(0)?.address?.geo)
        }
        override fun onFailure(call: Call<List<User>>, t: Throwable) {
            continuation.resumeWithException(t)
        }
    })
}
suspend fun getResult1FromApi():Geo?=suspendCoroutine{continuation->
val service=1!!.create(CallService::class.java)
service.getUsers().enqueue(对象:回调{
覆盖fun onResponse(调用:调用,响应:响应){
继续。继续(response.result.getOrNull(0)?.address?geo)
}
覆盖失效时的乐趣(调用:调用,t:可丢弃){
续。除异常情况外的恢复(t)
}
})
}

现在,您的函数是同步的,并返回一个
Geo
对象。

这很奇怪。默认情况下,挂起函数是同步的。除非您的
getResult1FromApi
有缺陷。您应该返回
Geo
而不是
Geo?
。我怀疑您的
suspend fun
s的实现已关闭。你能展示你的完整代码吗?