首页 > 解决方案 > 复制 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。关于如何做到这一点的任何建议?谢谢!

标签: kotlinokhttp

解决方案


一种简单的方法是以同步方式调用回调:

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

推荐阅读