2013-05-14 34 views
1

我有一個作爲綁定服務的應用程序。我將消息發送到服務,但有時我收到以下錯誤:指定的消息隊列同步障礙令牌尚未發佈

E/AndroidRuntime(28216): java.lang.IllegalStateException: The specified message queue synchronization barrier token has not been posted or has already been removed.

有時候,我得到這個錯誤,而不是:

android.util.AndroidRuntimeException: { what=888 when=0 } This message is already in use.

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

這裏是一個consistenly導致上結冰,因此被稱爲第二時間的方法。

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

我新的線程,使者和處理程序,所以任何幫助表示讚賞,感謝:)

+0

你現在有解決方案嗎?如果你這樣做,請張貼它。萬分感謝。 – antonio081014 2013-11-26 22:49:29

回答

3

問題是,你隊列消息,由message.obtain()分配。你需要通過調用

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

創建郵件的副本,然後才添加複印消息m到隊列。

+0

問題可能有點晚,但爲什麼我們需要這樣做? – Nikolai 2017-06-08 09:24:20

+1

因爲Android爲Messages實例使用了回收對象池。所有與Message.obtain相關的實例都可以鏈接到其他實例,因爲有一段時間。所以你必須重新創建排隊的實例來保存它們。 – 2017-06-08 09:27:01