2

我正在尝试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它会调用. 进一步的行为取决于当前是否在后台运行:doSomethingDataManagerAsyncTask

  • 如果它正在运行,那么此时 UI 线程将变得无响应。
  • 否则,我会IllegalStateException从 UI 线程的子例程中抛出Looper.loop, 说:

    IllegalStateException:指定的消息队列同步屏障令牌尚未发布或已被删除。

谷歌绝对没有为这条消息提供任何结果。几个小时以来,我一直在阅读文档并寻找类似的问题,但仍然不知道我可能做错了什么。有任何想法吗?

4

1 回答 1

6

知道了。显然,关于回收消息的情况是这样的:

如果您将其发送给处理程序,处理程序/循环器将为您回收它。

因此,不得在 内回收消息handleMessage

于 2013-02-03T17:43:57.057 回答