gpt4 book ai didi

java - 中断 BitmapFactory.decodeStream

转载 作者:行者123 更新时间:2023-11-29 05:56:16 24 4
gpt4 key购买 nike

假设我们有一个工作线程,它使用一些连接流调用 BitmapFactory.decodeStream,如下所示:

Bitmap bitmap = BitmapFactory.decodeStream(new URL(imgUrl).openConnection().getInputStream(), null, someUnrelatedOptions);

现在我们需要立即终止该线程以回收 BitmapFactory 分配的所有内存。我们不能等待它完成太久,因为 UI 线程需要内存。这个例子是简化的,所以我们不要详细说明为什么必须这样做。我正在寻找这种方法的解决方案,而不是另一种方法。

我们不能粗暴地杀死线程,因为它还在做一些其他事情,我们有可能会泄露一些东西。唯一干净的方法是使用 workerThread.interrupt()

不幸的是,BitmapFactory 并不关心线程是否被中断并继续执行它的工作。显然,我在 Thread.currentThread().isInterrupted() 存在后立即对其进行检查,但这还不够。在非常慢的互联网连接上,加载图像可能需要数年时间,这会卡住应用程序(请记住,UI 线程正在等待)。

所以问题是 - 如何让 BitmapFactory 在线程中断时停止?我的想法是将 InputStream 包装在自定义 FilterInputStream 中,覆盖每个函数(实际上并不多),并在每个函数中检查线程是否被中断。如果是,抛出一些 IOException。这样 BitmapFactory 将在尝试从 InputStream 中提取一些数据时立即停止,这应该足够了。有没有更好的方法?如果不是,我应该在抛出 IOException 之前在流上调用 close() 吗?

还有一点要注意:正在等待额外内存的 UI 线程正在显示一个漂亮的 ProgressBar,因此如果工作线程需要一两秒才能终止,这不是问题。

谢谢!

最佳答案

在原生处理非常大的 jpeg Assets 期间关闭 Bitmap.decodeStream 的输入流时,我在 ART 上遇到 sigsegv 错误。由于使用了非常强大(且易变)的 native 解码器,此功能至关重要。

我解决了这个问题,首先将输入流包装在 BufferedInputStream 中,然后将其传递给 decodeStream。

要可靠地中断 decodeStream,请关闭 BufferedInputstream (bis):

bis.mark(0); //Otto von?
bis.reset();
bis.close();

这将立即并残酷地停止 native 解码器,从您可以捕获的 decodeStream 生成堆栈跟踪(不会崩溃)。

根本问题在于 native 解码器,在过早关闭操作之前重置流似乎可以解决与内存相关的崩溃。

应该有一个明显的方法来可靠地中断解码器,这需要太多疯狂的实验才能解决。希望能在native层解决。

关于java - 中断 BitmapFactory.decodeStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com