我正在尝试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
运行工作线程并将处理程序与线程的 looper 相关联:
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 线程将变得无响应。
- 否则,我会
IllegalStateException
从 UI 线程的子例程中抛出Looper.loop
, 说:IllegalStateException:指定的消息队列同步屏障令牌尚未发布或已被删除。