私はHandlerThread
Androidで利用しようとしていますが、UIスレッドが応答しなくなる状況か、奇妙な状況に陥っていますIllegalStateException
。私の問題の最小限の例を紹介したいと思います。
DataManager
作成時にワーカースレッドをインスタンス化するクラスがあります。
public class DataManager
{
private final HandlerThread loaderThread = new HandlerThread( "Worker" );
private final Producer loader;
このクラスの中に、私は自分のHandler
定義を持っています:
private static class Producer extends Handler
{
public Producer( Looper looper )
{
super( looper );
}
@Override
public void handleMessage( Message msg )
{
msg.recycle();
}
}
myのコンストラクターはDataManager
、ワーカースレッドを実行し、ハンドラーをスレッドのルーパーに関連付けます。
public DataManager()
{
loaderThread.start();
this.loader = new Producer( loaderThread.getLooper() );
}
破棄される前にDataManager
、スレッドを停止し、終了するのを待ちます。実際、私のDataManager
インスタンスは常に生きているので、この部分は私の問題とは関係がないと思います。
@Override
protected void finalize() throws Throwable
{
loaderThread.quit();
loaderThread.join();
super.finalize();
}
最後にdoSomething
、ワーカースレッドにメッセージを投稿するだけのメソッドがあります。
public void doSomething()
{
Message msg = Message.obtain();
loader.sendMessage( msg );
}
DataManager
これで、UIスレッドのカスタムビューの内部からインスタンス化しています。ビューがそれを使用してそれ自体をペイントしようとしているとき、をonDraw
呼び出しdoSomething
ますDataManager
。それ以降の動作は、AsyncTask
が現在バックグラウンドで実行されているかどうかによって異なります。
- それが実行されている場合、UIスレッドはこの瞬間から応答しなくなります。
- それ以外の場合は、UIスレッドの
IllegalStateException
サブルーチン内からスローされ、次のようになります。Looper.loop
IllegalStateException:指定されたメッセージキュー同期バリアトークンが投稿されていないか、すでに削除されています。