假设我们有一个工作线程,它BitmapFactory.decodeStream
使用一些连接流进行调用,如下所示:
Bitmap bitmap = BitmapFactory.decodeStream(new URL(imgUrl).openConnection().getInputStream(), null, someUnrelatedOptions);
现在我们需要立即终止该线程以回收BitmapFactory
已分配的任何内存。我们不能等待它完成太久,因为 UI 线程需要内存。这个例子被简化了,所以让我们不要详细说明为什么必须这样做。我正在寻找这种方法的解决方案,而不是另一种方法。
我们不能残忍地杀死线程,因为它也在做一些其他的事情,我们有可能会泄露一些东西。唯一干净的方法是使用workerThread.interrupt()
.
不幸的是,BitmapFactory 并不关心线程是否被中断并继续工作。显然,我正在检查Thread.currentThread().isInterrupted()
它存在之后的权利,但这还不够。在非常慢的互联网连接上,加载图像可能需要数年时间,这将冻结应用程序(请记住,UI 线程正在等待)。
所以问题是 - 当线程被中断时我如何BitmapFactory
停止?我的想法是包装InputStream
in custom FilterInputStream
,覆盖每个函数(实际上并不多),并在每个函数中检查线程是否被中断。如果是,扔一些IOException
. BitmapFactory
一旦尝试从中提取一些数据,这种方式就会停止InputStream
,这应该足够了。有没有更好的方法?如果不是,我应该close()
在投掷之前调用流IOException
吗?
还有一点注意:正在等待额外内存的 UI 线程正在显示 nice ProgressBar
,因此如果工作线程需要一两秒钟才能终止,这不是问题。
谢谢!