6

バインドされたサービスとしてのアプリがあります。サービスにメッセージを送信していますが、次のエラーが発生することがあります。

E/AndroidRuntime(28216): java.lang.IllegalStateException: 指定されたメッセージ キュー同期バリア トークンがポストされていないか、既に削除されています。

代わりに次のエラーが表示されることがあります。

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

これは、2回目に呼び出されたときに一貫してフリーズするメソッドです。

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

私はスレッディング、メッセンジャー、ハンドラーを初めて使用するので、助けていただければ幸いです:)

4

1 に答える 1

5

問題は、によって割り当てられたメッセージをキューに入れることですmessage.obtain()。を呼び出してメッセージのコピーを作成する必要があります

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

その後、コピーされmたメッセージをキューに追加します。

于 2014-04-18T09:31:33.663 に答える