【问题标题】:The specified message queue synchronization barrier token has not been posted指定的消息队列同步屏障令牌尚未发布
【发布时间】:2013-05-14 18:25:38
【问题描述】:

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

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

有时我会收到此错误:

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

有时用户界面只是冻结。我通过处理程序从服务到活动进行通信,反之亦然。

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

我是 Threading、Messengers 和 Handlers 的新手,因此感谢您提供任何帮助,谢谢 :)

【问题讨论】:

  • 你现在有解决办法了吗?如果你这样做,请发布它。非常感谢。

标签: android android-handler


【解决方案1】:

问题是您将由message.obtain() 分配的消息排队。您需要通过调用创建消息副本

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

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

【讨论】:

  • 现在问可能有点晚了,但我们为什么需要这样做呢?
  • 因为 Android 为 Messages 实例使用回收对象池。与Message.obtain 关联的所有实例自一段时间以来都可以链接到其他实例。所以你必须重新创建排队的实例来保留它们。
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 2020-02-02
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多