尚未发布指定的消息队列同步障碍标记

时间:2013-05-14 18:25:39

标签: android android-handler

我有一个应用程序作为绑定服务。我正在向服务发送消息,但有时我收到以下错误:

  

E / AndroidRuntime(28216):java.lang.IllegalStateException:The   指定的消息队列同步屏障令牌尚未   已发布或已被删除。

有时我会收到此错误:

  

android.util.AndroidRuntimeException:{what = 888 when = 0}此消息   已经在使用中。

有时UI会冻结。我通过处理程序从服务到活动进行通信,反之亦然。

 public void init(IBinder service){
    playerService = new Messenger(service);
    setBound(true);
    try {
        Message msg = Message.obtain(null, PlayerService.MSG_REGISTER_CLIENT);
        msg.replyTo = messenger;
        playerService.send(msg);
        while(!messageQueue.isEmpty()){
            playerService.send(messageQueue.remove());
        }
    } catch (RemoteException e) {
        // In this case the service has crashed before we could even do anything with it
        Log.d(Player.TAG, "problem binding player messenger " + e.getMessage());
    }
}

这是一种方法,它在第二次调用时一致地导致冻结。

public void play(String url) {
    Message msg = Message.obtain(null, PlayerService.PLAY, 0, 0);
    msg.setData(getURLBundle(url));
    sendMessage(msg);
}

private void sendMessage(Message message){
    if(!isBound){
        Log.d(Player.TAG, "isnt bound, queueing message");
        messageQueue.add(message);
    }else {
        try {
            playerService.send(message);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

我是线程,信使和处理程序的新手,所以感谢任何帮助,谢谢:)

1 个答案:

答案 0 :(得分:3)

问题是您对由message.obtain()分配的消息进行排队。您需要通过调用

创建消息副本
Message m = new Message();
m.copyFrom(message);

然后才将复制的消息m添加到队列中。