From b1e90dde8f9cdae86e8cb7c6814f077b82e5c26c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 18 Apr 2020 12:20:18 +0300 Subject: [PATCH] Optimize page loading --- .../java/org/koitharu/kotatsu/ui/reader/PageLoader.kt | 10 ++++++++-- .../java/org/koitharu/kotatsu/utils/ext/CommonExt.kt | 9 +++++++++ app/src/main/res/layout/item_page.xml | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/PageLoader.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/PageLoader.kt index badbe52d2..39be815a7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/PageLoader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/PageLoader.kt @@ -16,7 +16,7 @@ import kotlin.coroutines.CoroutineContext class PageLoader : KoinComponent, CoroutineScope, DisposableHandle { private val job = SupervisorJob() - private val tasks = HashMap() + private val tasks = HashMap>() private val okHttp by inject() private val cache by inject() @@ -30,8 +30,13 @@ class PageLoader : KoinComponent, CoroutineScope, DisposableHandle { return it } } + val task = tasks[url]?.takeUnless { it.isCancelled } + return (task ?: loadAsync(url).also { tasks[url] = it }).await() + } + + private fun loadAsync(url: String) = async(Dispatchers.IO) { val uri = Uri.parse(url) - return if (uri.scheme == "cbz") { + if (uri.scheme == "cbz") { val zip = ZipFile(uri.schemeSpecificPart) val entry = zip.getEntry(uri.fragment) zip.getInputStream(entry).use { @@ -60,5 +65,6 @@ class PageLoader : KoinComponent, CoroutineScope, DisposableHandle { override fun dispose() { coroutineContext.cancel() + tasks.clear() } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CommonExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CommonExt.kt index 39b790d39..0c6e2b28d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CommonExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CommonExt.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu.utils.ext import android.content.res.Resources +import android.util.Log import kotlinx.coroutines.delay import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R @@ -43,4 +44,12 @@ fun Throwable.getDisplayMessage(resources: Resources) = when (this) { } else { resources.getString(R.string.error_occurred) } +} + +inline fun measured(tag: String, block: () -> T): T { + val time = System.currentTimeMillis() + val res = block() + val spent = System.currentTimeMillis() - time + Log.d("measured", "$tag ${spent.format(1)} ms") + return res } \ No newline at end of file diff --git a/app/src/main/res/layout/item_page.xml b/app/src/main/res/layout/item_page.xml index f5e2d66c0..9be300434 100644 --- a/app/src/main/res/layout/item_page.xml +++ b/app/src/main/res/layout/item_page.xml @@ -2,6 +2,7 @@