如何在协同程序中进行同步呼叫

赫里蒂克·古普塔

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

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()
}}

在我的fakeApiRequest()中,我正在发出两个网络请求。

private suspend fun fakeApiRequest() {
val result1 :Geo?= getResult1FromApi()
val result2: Long? = getResult2FromApi(result1)}

因为这是一个异步调用,所以我在getResult2FromApi(result1)方法中收到了空指针异常,因为传递的参数为null。

为了解决此问题,我必须在第一次通话中添加delay(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
}

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

马克·托波尼克(Marko Topolnik)

您尚未正确实现可暂停功能。您必须使用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)
        }
    })
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Angular js中进行同步http请求

来自分类Dev

如何停止协同程序?

来自分类Dev

如何在“快照程序删除”后进行同步

来自分类Dev

如何在Angular 2中进行同步http调用

来自分类Dev

科特林协同程序如何知道何时进行网络通话时产生?

来自分类Dev

如何在Android上使用协同程序进行有无中断的取消,包括根据生命周期自动取消?

来自分类Dev

如何使用协同程序依次执行操作?

来自分类Dev

如何强制python版本在从GCP dataproc集群旋转的datalab实例中进行同步?

来自分类Dev

以正确的方式使用协同程序

来自分类Dev

具有外部功能的协同程序

来自分类Dev

在/ proc / meminfo中进行同步后,哪些行会更改?

来自分类Dev

如何进行同步WebScoket连接

来自分类Dev

具有协同程序上下文的Android WorkManager在同步模式下不起作用

来自分类Dev

如何从Java的执行人在Android中科特林的协同程序有什么不同?

来自分类Dev

如何在Android中执行同步?

来自分类Dev

如何在Android中执行同步?

来自分类Dev

如何在Java中对来自不同对象的相等键进行同步

来自分类Dev

如何在node.js的async.each内进行同步http调用

来自分类Dev

如何在Hazelcast中为ReplicatedMap进行同步初始填充?

来自分类Dev

Vue JS + HighChart-如何在呈现组件之前进行同步axios调用?

来自分类Dev

如何在异步节点应用启动之前进行同步数据库查询?

来自分类Dev

如何在使用pthread的定时器中的哪个线程之间进行同步?

来自分类Dev

系统时钟漂移-如何在没有互联网的情况下进行同步

来自分类Dev

如何在 Node.js 中使用“async/await”和“promises”进行同步执行?

来自分类Dev

如何在节点服务器上进行同步 http 请求?

来自分类Dev

如何在Realm(iOS)中进行写入操作同步?

来自分类Dev

如何在vba中进行实时更新或同步

来自分类Dev

链ASYNCIO协同程序内嵌在asyncio.gather

来自分类Dev

使用协同程序执行Android Kotlin任务

Related 相关文章

  1. 1

    如何在Angular js中进行同步http请求

  2. 2

    如何停止协同程序?

  3. 3

    如何在“快照程序删除”后进行同步

  4. 4

    如何在Angular 2中进行同步http调用

  5. 5

    科特林协同程序如何知道何时进行网络通话时产生?

  6. 6

    如何在Android上使用协同程序进行有无中断的取消,包括根据生命周期自动取消?

  7. 7

    如何使用协同程序依次执行操作?

  8. 8

    如何强制python版本在从GCP dataproc集群旋转的datalab实例中进行同步?

  9. 9

    以正确的方式使用协同程序

  10. 10

    具有外部功能的协同程序

  11. 11

    在/ proc / meminfo中进行同步后,哪些行会更改?

  12. 12

    如何进行同步WebScoket连接

  13. 13

    具有协同程序上下文的Android WorkManager在同步模式下不起作用

  14. 14

    如何从Java的执行人在Android中科特林的协同程序有什么不同?

  15. 15

    如何在Android中执行同步?

  16. 16

    如何在Android中执行同步?

  17. 17

    如何在Java中对来自不同对象的相等键进行同步

  18. 18

    如何在node.js的async.each内进行同步http调用

  19. 19

    如何在Hazelcast中为ReplicatedMap进行同步初始填充?

  20. 20

    Vue JS + HighChart-如何在呈现组件之前进行同步axios调用?

  21. 21

    如何在异步节点应用启动之前进行同步数据库查询?

  22. 22

    如何在使用pthread的定时器中的哪个线程之间进行同步?

  23. 23

    系统时钟漂移-如何在没有互联网的情况下进行同步

  24. 24

    如何在 Node.js 中使用“async/await”和“promises”进行同步执行?

  25. 25

    如何在节点服务器上进行同步 http 请求?

  26. 26

    如何在Realm(iOS)中进行写入操作同步?

  27. 27

    如何在vba中进行实时更新或同步

  28. 28

    链ASYNCIO协同程序内嵌在asyncio.gather

  29. 29

    使用协同程序执行Android Kotlin任务

热门标签

归档