diff --git a/app/src/main/java/com/hippo/UriArchiveAccessor.kt b/app/src/main/java/com/hippo/UriArchiveAccessor.kt index a27bbb2ef..67635d98f 100644 --- a/app/src/main/java/com/hippo/UriArchiveAccessor.kt +++ b/app/src/main/java/com/hippo/UriArchiveAccessor.kt @@ -19,6 +19,7 @@ package com.hippo import android.content.Context import android.net.Uri +import com.hippo.image.Image import java.nio.ByteBuffer class UriArchiveAccessor(ctx: Context, uri: Uri) { @@ -28,7 +29,7 @@ class UriArchiveAccessor(ctx: Context, uri: Uri) { } private external fun openArchive(fd: Int, size: Long): Int - external fun extractToByteBuffer(index: Int): ByteBuffer? + private external fun extractToByteBuffer(index: Int): ByteBuffer? external fun extractToFd(index: Int, fd: Int) external fun getFilename(index: Int): String external fun needPassword(): Boolean @@ -39,8 +40,23 @@ class UriArchiveAccessor(ctx: Context, uri: Uri) { pfd.close() } + fun getImageSource(index: Int): Image.ByteBufferSource? { + val buffer = extractToByteBuffer(index) + buffer ?: return null + check(buffer.isDirect) + return object : Image.ByteBufferSource { + override fun getByteBuffer(): ByteBuffer { + return buffer + } + + override fun close() { + releaseByteBuffer(buffer) + } + } + } + companion object { @JvmStatic - external fun releaseByteBuffer(buffer: ByteBuffer) + private external fun releaseByteBuffer(buffer: ByteBuffer) } } \ No newline at end of file diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java index 4c4f0e08c..abf4a499c 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.java @@ -17,7 +17,6 @@ package com.hippo.ehviewer.gallery; import android.content.Context; -import android.graphics.ImageDecoder; import android.net.Uri; import android.os.Handler; import android.os.Process; @@ -38,7 +37,6 @@ import com.hippo.yorozuya.thread.PriorityThread; import java.io.FileOutputStream; import java.io.IOException; -import java.nio.ByteBuffer; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; @@ -56,7 +54,7 @@ public class ArchivePageLoader extends PageLoader2 { public static PVLock pv = new PVLock(0); private final UriArchiveAccessor archiveAccessor; private final Stack requests = new Stack<>(); - private final LinkedHashMap streams = new LinkedHashMap<>(); + private final LinkedHashMap streams = new LinkedHashMap<>(); private final Thread[] decodeThread = new Thread[]{ new Thread(new DecodeTask()), new Thread(new DecodeTask()), @@ -305,10 +303,10 @@ public class ArchivePageLoader extends PageLoader2 { } } - ByteBuffer buffer = archiveAccessor.extractToByteBuffer(index); + Image.ByteBufferSource src = archiveAccessor.getImageSource(index); synchronized (streams) { - streams.put(index, buffer); + streams.put(index, src); streams.notify(); } } @@ -320,7 +318,7 @@ public class ArchivePageLoader extends PageLoader2 { public void run() { while (!Thread.currentThread().isInterrupted()) { int index; - ByteBuffer buffer; + Image.ByteBufferSource src; synchronized (streams) { if (streams.isEmpty()) { try { @@ -331,21 +329,16 @@ public class ArchivePageLoader extends PageLoader2 { continue; } - Iterator> iterator = streams.entrySet().iterator(); - Map.Entry entry = iterator.next(); + Iterator> iterator = streams.entrySet().iterator(); + Map.Entry entry = iterator.next(); iterator.remove(); index = entry.getKey(); - buffer = entry.getValue(); + src = entry.getValue(); } Image image = null; - if (buffer != null) { - try { - image = Image.decode(buffer.asReadOnlyBuffer()); - } catch (ImageDecoder.DecodeException e) { - UriArchiveAccessor.releaseByteBuffer(buffer); - e.printStackTrace(); - } + if (src != null) { + image = Image.decode(src); } if (image != null) { notifyPageSucceed(index, image); diff --git a/app/src/main/java/com/hippo/image/Image.kt b/app/src/main/java/com/hippo/image/Image.kt index 5361458d2..006b434a1 100644 --- a/app/src/main/java/com/hippo/image/Image.kt +++ b/app/src/main/java/com/hippo/image/Image.kt @@ -25,7 +25,6 @@ import android.graphics.ImageDecoder.Source import android.graphics.drawable.Animatable import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable -import com.hippo.UriArchiveAccessor import com.hippo.ehviewer.EhApplication import java.io.FileInputStream import java.nio.ByteBuffer @@ -92,23 +91,18 @@ class Image private constructor(source: Source, private var releaseCall: (() -> return Image(src) } - @Throws(DecodeException::class) @JvmStatic - fun decode(buffer: ByteBuffer): Image { - val src = ImageDecoder.createSource(buffer) - return Image(src) { - UriArchiveAccessor.releaseByteBuffer(buffer) - } - } - - @Throws(DecodeException::class) - @JvmStatic - fun decode(src: ByteBufferSource): Image { + fun decode(src: ByteBufferSource): Image? { val directBuffer = src.getByteBuffer() check(directBuffer.isDirect) - return Image(ImageDecoder.createSource(directBuffer)) { + return runCatching { + Image(ImageDecoder.createSource(directBuffer)) { + src.close() + } + }.onFailure { src.close() - } + it.printStackTrace() + }.getOrNull() } }