Pooling the bytebuffer
This commit is contained in:
1 parent
110fb9fb59
commit
b695b06507
4 files changed
+14
-5
No files matched your search
@@ -244,6 +244,8 @@ dependencies {
|
||||
implementation("io.coil-kt:coil-compose")
|
||||
implementation("io.coil-kt:coil-gif")
|
||||
|
||||
implementation("io.ktor:ktor-io-jvm:2.3.1")
|
||||
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.5.1")
|
||||
implementation("org.jsoup:jsoup:1.16.1")
|
||||
|
||||
Vendored
+3
@@ -17,6 +17,9 @@
|
||||
-keep class com.hippo.ehviewer.client.parser.TorrentResult { *; }
|
||||
-keep class com.hippo.ehviewer.client.parser.Limits { *; }
|
||||
|
||||
# Ktor logger
|
||||
-dontwarn org.slf4j.impl.StaticLoggerBinder
|
||||
|
||||
-keepattributes LineNumberTable,SourceFile
|
||||
-renamesourcefileattribute SourceFile
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import android.net.http.UrlResponseInfo
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresExtension
|
||||
import com.hippo.ehviewer.EhApplication
|
||||
import io.ktor.utils.io.pool.DirectByteBufferPool
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
@@ -18,6 +19,8 @@ import kotlin.coroutines.Continuation
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.coroutines.resumeWithException
|
||||
|
||||
private val pool = DirectByteBufferPool(32)
|
||||
|
||||
val cronetHttpClient = HttpEngine.Builder(appCtx).apply {
|
||||
setEnableHttp2(true)
|
||||
setEnableBrotli(true)
|
||||
@@ -54,28 +57,29 @@ 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?) {
|
||||
// No-op
|
||||
pool.recycle(buffer)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Pool it
|
||||
val buffer: ByteBuffer = ByteBuffer.allocateDirect(4096)
|
||||
val buffer = pool.borrow()
|
||||
}
|
||||
|
||||
inline fun cronetRequest(url: String, conf: UrlRequest.Builder.() -> Unit) = CronetRequest().apply {
|
||||
request = cronetHttpClient.newUrlRequestBuilder(url, cronetHttpClientExecutor, callback).apply(conf).build()
|
||||
}
|
||||
|
||||
suspend infix fun CronetRequest.consumeBody(callback: (UrlResponseInfo, ByteBuffer) -> Unit) = apply {
|
||||
suspend infix fun CronetRequest.consumeBodyFully(callback: (UrlResponseInfo, ByteBuffer) -> Unit) = apply {
|
||||
mConsumer = callback
|
||||
suspendCancellableCoroutine { cont ->
|
||||
readerCont = cont
|
||||
|
||||
@@ -142,7 +142,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) {
|
||||
saveResponseMeta(index, type, length) { file ->
|
||||
file.openOutputStream().use {
|
||||
val chan = it.channel
|
||||
consumeBody { info, buffer ->
|
||||
consumeBodyFully { info, buffer ->
|
||||
val read = chan.write(buffer)
|
||||
notifyProgress(length, info.receivedByteCount, read)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user