From 47b97243c3235bd4eedc33261f8871da8d192d73 Mon Sep 17 00:00:00 2001 From: tarsin Date: Sun, 18 Jun 2023 16:33:54 +0800 Subject: [PATCH] Refine polling recycle --- .../spider/Android14CoroutineHttpEngine.kt | 5 ++-- .../com/hippo/ehviewer/spider/SpiderDen.kt | 29 +++++++++++-------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt b/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt index 27d57c0e2..02211b89a 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt @@ -57,22 +57,21 @@ class CronetRequest { override fun onSucceeded(p0: UrlRequest, p1: UrlResponseInfo) { val length = p1.receivedByteCount // TODO: validate body length - pool.recycle(buffer) readerCont.resume(Unit) daemonCont.resume(true) } override fun onFailed(p0: UrlRequest, p1: UrlResponseInfo?, p2: HttpException) { - pool.recycle(buffer) daemonCont.resumeWithException(p2) } override fun onCanceled(p0: UrlRequest, p1: UrlResponseInfo?) { - pool.recycle(buffer) } } val buffer = pool.borrow() + + fun dispose() = pool.recycle(buffer) } inline fun cronetRequest(url: String, conf: UrlRequest.Builder.() -> Unit) = CronetRequest().apply { diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index 648cd6f8c..63ed3e68a 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -133,22 +133,27 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { notifyProgress: (Long, Long, Int) -> Unit, ): Boolean { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7) { - cronetRequest(url) { + val req = cronetRequest(url) { referer?.let { addHeader("Referer", it) } - } execute { info -> - val headers = info.headers.asMap - val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg" - val length = headers["Content-Length"]!!.first().toLong() - saveResponseMeta(index, type, length) { file -> - file.openOutputStream().use { - val chan = it.channel - consumeBodyFully { info, buffer -> - val read = chan.write(buffer) - notifyProgress(length, info.receivedByteCount, read) + } + try { + req execute { info -> + val headers = info.headers.asMap + val type = headers["Content-Type"]?.first()?.toMediaType()?.subtype ?: "jpg" + val length = headers["Content-Length"]!!.first().toLong() + saveResponseMeta(index, type, length) { file -> + file.openOutputStream().use { + val chan = it.channel + consumeBodyFully { info, buffer -> + val read = chan.write(buffer) + notifyProgress(length, info.receivedByteCount, read) + } } + file.length() } - file.length() } + } finally { + req.dispose() } } else { ehRequest(url, referer).executeNonCache {