Java 中断BitmapFactory.decodeStream

Java 中断BitmapFactory.decodeStream,java,android,multithreading,inputstream,bitmapfactory,Java,Android,Multithreading,Inputstream,Bitmapfactory,假设我们有一个工作线程,它使用一些连接流调用BitmapFactory.decodeStream,如下所示: Bitmap bitmap = BitmapFactory.decodeStream(new URL(imgUrl).openConnection().getInputStream(), null, someUnrelatedOptions); 现在我们需要立即终止该线程,以便回收BitmapFactory分配的任何内存。我们不能等待太久,因为UI线程需要内存。这个例子被简化了,所以我

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

Bitmap bitmap = BitmapFactory.decodeStream(new URL(imgUrl).openConnection().getInputStream(), null, someUnrelatedOptions);
现在我们需要立即终止该线程,以便回收
BitmapFactory
分配的任何内存。我们不能等待太久,因为UI线程需要内存。这个例子被简化了,所以我们不必详细说明为什么要这样做。我在寻找这种方法的解决方案,而不是另一种方法

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

不幸的是,BitmapFactory并不关心线程是否被中断,而是继续工作。显然,我正在检查
Thread.currentThread().isInterrupted()
,但这还不够。在速度非常慢的互联网连接上,加载映像可能需要数年时间,这将冻结应用程序(请记住,UI线程正在等待)

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

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


谢谢

我认为您可以在UI线程中调用一些unrelatedoptions->requestCancelDecode()来取消解码,尽管不能保证取消解码

谷歌关键词“bitmapfactory requestCancelDecode解码流url openconnection”(不带引号)您可以在中找到示例代码

问候


Ziteng Chen

在Bitmap.decodeStream的本机处理非常大的jpeg资产时,在关闭其输入流时,我在ART上遇到了sigsegv错误。由于使用了非常强大(且不稳定)的本机解码器,此功能非常重要

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

要可靠地中断解码流,请关闭BufferedInputstream(bis),从而:

这将立即粗暴地停止本机解码器,从decodeStream生成一个stacktrace,您可以捕获它(没有崩溃)

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


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

这很有趣,我以前没听说过。谢谢你的回答,我可能会合并这两种解决方案。
bis.mark(0); //Otto von?
bis.reset();
bis.close();