kotlin - 复制 enqueue() 方法
问题描述
我有以下方法,它只是以ether SYNC或ASYNC方式获取数据:
enum class CallType { SYNC, ASYNC }
suspend fun get( url: String, callType : CallType, mock : String? = null, callback: Callback? ): Response?
{
var response : okhttp3.Response ?= null
val request = Request.Builder()
.url( url )
.build()
val call = client.newCall( request )
if( mock != null )
{
// this works fine for SYNC, but how to make it work with ASYNC callback?
delay( 1000 )
return okhttp3.Response.Builder().body(
ResponseBody.create( "application/json".toMediaType(), mock )
).build()
}
if( callType == CallType.ASYNC && callback != null )
call.enqueue( callback )
else
response = call.execute()
return response
}
我希望能够模拟/覆盖响应。当我使用 SYNC 方式时,我可以做到这一点,因为我只需要构造并返回一个假的 okhttp3.response,就像下面的代码片段一样,代码执行停止并且一切正常:
if( mock != null )
{
delay( 1000 )
return okhttp3.Response.Builder().body(
ResponseBody.create( "application/json".toMediaType(), mock )
).build()
}
问题是我希望能够对 ASYNC 调用做同样的事情,但我不确定从这里去哪里。我基本上是在尝试复制 enqueue() 方法,以便在经过一些延迟后触发我的回调(已传递给 get() 方法),并且我的假 okhttp3.Response 通过回调返回,而不是return。关于如何做到这一点的任何建议?谢谢!
解决方案
一种简单的方法是以同步方式调用回调:
if (mock != null) {
val response = ... // prepare mock response here
callback.onResponse(response)
}
因此,即使在您的 get 函数完成之前,也会调用回调。
如果你想实现响应实际上是异步传递的,你需要从一个额外的协程中执行模拟传递
if (mock != null) {
GlobalScope.launch {
val response = ... // prepare mock response here
delay(1000)
callback.onResponse(response)
}
}
推荐阅读
- postgresql - 连接两个整数列是独立工作的,但不是在一个函数中
- ios - @available 属性不适用于 XCTest 类或方法
- sql - 在 oracle 中使用 REGEXP_REPLACE 删除所有特殊字符
- python - 如何在基于类的视图中返回 JSON 响应,而不是 HTTP 响应
- node.js - 将 Excel 文件中的数据转换为 JSON 并将其存储在 MongoDB 中
- python - on_epoch_end() 未在 keras fit_generator() 中调用
- python - 使用 Pyglet 可视化大量数据
- capl - 如何使用 CAPL 在 CANoe 中模拟错误帧并使错误计数器增加/减少?
- c# - FreshPageModelResolver.ResolvePageModel<>() 出错;
- excel - excel中的数据库vlookup有什么问题