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
包装在customFilterInputStream
中,覆盖每个函数(实际上并不多),并在每个函数中检查线程是否中断。如果是,抛出一些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();