From 8b5df3d54d676b6546949c04a1bec8cb7f3fb955 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Wed, 17 Jan 2024 12:16:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/lib/cronet/AbsCallBack.kt | 25 +++++++++++-------- .../io/legado/app/lib/cronet/NewCallBack.kt | 1 + .../io/legado/app/lib/cronet/OldCallback.kt | 1 + 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/cronet/AbsCallBack.kt b/app/src/main/java/io/legado/app/lib/cronet/AbsCallBack.kt index 18066db62..dfe3a93b2 100644 --- a/app/src/main/java/io/legado/app/lib/cronet/AbsCallBack.kt +++ b/app/src/main/java/io/legado/app/lib/cronet/AbsCallBack.kt @@ -91,7 +91,7 @@ abstract class AbsCallBack( return } if (mCall.isCanceled()) { - onError(IOException("Request Canceled")) + onError(IOException("Cronet Request Canceled")) request.cancel() return } @@ -122,13 +122,6 @@ abstract class AbsCallBack( override fun onResponseStarted(request: UrlRequest, info: UrlResponseInfo) { this.request = request - cancelJob = Coroutine.async { - while (!mCall.isCanceled()) { - delay(1000) - } - request.cancel() - } - val response: Response try { response = toResponse(originalRequest, info, urlResponseInfoChain, CronetBodySource()) @@ -184,6 +177,7 @@ abstract class AbsCallBack( //UrlResponseInfo可能为null override fun onFailed(request: UrlRequest, info: UrlResponseInfo?, error: CronetException) { callbackResults.add(CallbackResult(CallbackStep.ON_FAILED, null, error)) + cancelJob?.cancel() DebugLog.e(javaClass.name, error.message.toString()) onError(error.asIOException()) eventListener?.callFailed(mCall, error) @@ -203,11 +197,20 @@ abstract class AbsCallBack( } canceled.set(true) callbackResults.add(CallbackResult(CallbackStep.ON_CANCELED)) + cancelJob?.cancel() //DebugLog.i(javaClass.simpleName, "cancel[${info?.negotiatedProtocol}]${info?.url}") eventListener?.callEnd(mCall) - //onError(IOException("Cronet Request Canceled")) + onError(IOException("Cronet Request Canceled")) } + fun startCheckCancelJob(request: UrlRequest) { + cancelJob = Coroutine.async { + while (!mCall.isCanceled()) { + delay(1000) + } + request.cancel() + } + } init { mResponse = Response.Builder() @@ -431,7 +434,7 @@ abstract class AbsCallBack( @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") override fun read(sink: Buffer, byteCount: Long): Long { if (canceled.get()) { - throw IOException("Request Canceled") + throw IOException("Cronet Request Canceled") } require(byteCount >= 0L) { "byteCount < 0: $byteCount" } @@ -450,7 +453,7 @@ abstract class AbsCallBack( val result = callbackResults.poll(timeout, TimeUnit.MILLISECONDS) if (result == null) { request?.cancel() - throw IOException("Body Read Timeout") + throw IOException("Cronet request body read timeout after wait $timeout ms") } return when (result.callbackStep) { diff --git a/app/src/main/java/io/legado/app/lib/cronet/NewCallBack.kt b/app/src/main/java/io/legado/app/lib/cronet/NewCallBack.kt index 21a5e3e0b..701c9ea49 100644 --- a/app/src/main/java/io/legado/app/lib/cronet/NewCallBack.kt +++ b/app/src/main/java/io/legado/app/lib/cronet/NewCallBack.kt @@ -23,6 +23,7 @@ class NewCallBack(originalRequest: Request, mCall: Call, readTimeoutMillis: Int) @Throws(IOException::class) override fun waitForDone(urlRequest: UrlRequest): Response { urlRequest.start() + startCheckCancelJob(urlRequest) //DebugLog.i(javaClass.simpleName, "start ${originalRequest.method} ${originalRequest.url}") return if (mCall.timeout().timeoutNanos() > 0) { responseFuture.get(mCall.timeout().timeoutNanos(), TimeUnit.NANOSECONDS) diff --git a/app/src/main/java/io/legado/app/lib/cronet/OldCallback.kt b/app/src/main/java/io/legado/app/lib/cronet/OldCallback.kt index c598eb651..faf1fc635 100644 --- a/app/src/main/java/io/legado/app/lib/cronet/OldCallback.kt +++ b/app/src/main/java/io/legado/app/lib/cronet/OldCallback.kt @@ -20,6 +20,7 @@ class OldCallback(originalRequest: Request, mCall: Call, readTimeoutMillis: Int) //获取okhttp call的完整请求的超时时间 val timeOutMs: Long = mCall.timeout().timeoutNanos() / 1000000 urlRequest.start() + startCheckCancelJob(urlRequest) if (timeOutMs > 0) { mResponseCondition.block(timeOutMs) } else {