java.lang.IllegalStateException: cannot make a new request because the previous response is still open: please call response.close()

问题描述 投票:0回答:1

这是拦截器代码,我无法弄清楚在 logCat 上调用 response.close() 的位置,它指出错误出现在“response = chain.proceed(request)”上。我应该在哪里放置响应。 close() 调用还是我使用 closeQuietly()

AppInterceptor类:拦截器{

override fun intercept(chain: Interceptor.Chain): Response {
    var request = chain.request()

      try{
          var response = chain.proceed(request)
          var tryCount = 0
          val maxTries = 5

        while (!response.isSuccessful && tryCount < maxTries){
            tryCount++
            Thread.sleep(1500)
            request = request.newBuilder().build()
            response = chain.proceed(request)

        }
        return response

      }catch (e: Exception){
        e.printStackTrace()
        val message: String

        when (e){
            is SocketTimeoutException ->{
                message = Constants.SOCKET_TIMEOUT
            }

            is UnknownHostException ->{
                message = Constants.UNKNOWN_HOST
            }

            is ConnectionShutdownException ->{
                message = Constants.CONNECTION_SHUTDOWN
            }

            is IOException ->{
                message = Constants.IO_EXCEPTION_MESSAGE
            }

            is IllegalStateException ->{
                message = "${e.message}"
            }
            else ->{
                message = "${e.message}"
            }
        }
        return Response.Builder()
            .request(request)
            .protocol(Protocol.HTTP_1_1)
            .code(999)
            .message(message)
            .body("{${e}".toResponseBody(null))
            .build()
    }

}

}

android android-studio kotlin retrofit
1个回答
0
投票

您应该在调用

chain.proceed(request)
方法之前关闭 所以你的代码会像这样

while (!response.isSuccessful && tryCount < maxTries){
            tryCount++
            request = request.newBuilder().build()
            response.close() // here you need to add
            response = chain.proceed(request)

        }

更多信息可以看这个回答https://stackoverflow.com/a/31733634/5696047

我不知道你为什么添加

Thread.sleep(1500)
但我认为这不是必需的

© www.soinside.com 2019 - 2024. All rights reserved.