Android 尚未发布指定的消息队列同步屏障令牌

Android 尚未发布指定的消息队列同步屏障令牌,android,android-handler,Android,Android Handler,我有一个应用程序作为绑定服务。我正在向服务发送消息,但有时会出现以下错误: E/AndroidRuntime(28216):java.lang.IllegalStateException: 指定的消息队列同步屏障令牌尚未启用 已发布或已删除 有时我会出现以下错误: android.util.AndroidRuntimeException:{what=888 when=0}此消息 已在使用中 有时候UI会冻结。我通过经办人与服务机构和visa国际组织进行沟通 public void init(I

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

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

有时我会出现以下错误:

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

有时候UI会冻结。我通过经办人与服务机构和visa国际组织进行沟通

 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();
        }
    }
}

我不熟悉线程、信使和处理程序,因此非常感谢您的帮助,谢谢:)

问题是您对消息进行排队,这些消息由
message.get()分配。您需要通过调用创建邮件副本

Message m = new Message();
m.copyFrom(message);

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

您现在有解决方案了吗?如果有,请把它寄出去。非常感谢。现在提问可能有点晚了,但为什么我们需要这样做呢?因为Android使用回收对象池来处理消息实例。与
消息关联的所有实例。从一段时间以来,获取
可以链接到其他实例。因此,您必须重新创建排队实例以保持它们。