gpt4 book ai didi

kotlin - 复制enqueue()方法

转载 作者:行者123 更新时间:2023-12-02 13:20:07 26 4
gpt4 key购买 nike

我有以下方法,可以简单地以太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通过回调而不是返回返回。关于如何做到这一点的任何建议?谢谢!

最佳答案

您正在将不同的概念与您的实现混合在一起。异步应该使用CoroutineContext而不是参数来控制。这样,您将始终返回非null值。隐藏实现细节(此处为OkHttp)并且不公开它也是明智的。

您可以使用suspendCoroutine将Cookoutine与OkHttp桥接。

suspend fun get(
url: String,
mock : String? = null
) = if(mock != null) {
delay( 1000 )
Response.Builder().body(
ResponseBody.create(
"application/json".toMediaType()
mock
)
).build()
} else suspendCoroutine { continuation ->
client.newCall(
Request.Builder()
.url(url)
.build()
).enqueue(
object : Callback {
override fun onFailure(call: Call, e: IOException) =
continuation.resumeWithException(e)
override fun onResponse(call: Call, response: Response) =
continuation.resume(response)
}
)
}

要同步访问,只需使用
runBlocking { get(url, mock) }

如果您确实需要提供自己的 Callable,则可以轻松地委派给它。但是,即使在模拟响应时并不需要它,您也必须创建一个 call 。

关于kotlin - 复制enqueue()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58844346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com