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
十分なはずです。より良い方法はありますか?close()
いいえの場合、スローする前にストリームを呼び出す必要がありIOException
ますか?
そして少し注意してください:追加のメモリを待っているUIスレッドは素晴らしいを表示しているProgressBar
ので、ワーカースレッドが終了するのに1〜2秒かかる場合でも問題はありません。
ありがとう!