0

データ通信にBluetoothを使用していますが、それは単なるメモであり、私の質問に直接添付されていません. リモート デバイスは、1 ミリ秒あたり 5 ~ 10 バイトのパケットを送信します。私はそれらを分類して、メッセージを介してメインのアクティビティに送信します。差出人:

Bundle bundle = new Bundle();
Message msg;
if(something)
{
    bundle.putSerializable("data", aObject);
    msg = myHandler.obtainMessage(1);
}
else
{
    bundle.putSerializable("data", bObject);
    msg = myHandler.obtainMessage(2);
}
msg.setData(bundle);
mHandler.sendMessage(msg);

ハンドラー内。

switch (msg.what)
{
    // aObject
    case 1:
        AObject aObject = (AObject) message.getData().get("data");
        break;
// bObject
    case 2:
        BObject bObject = (BObject) message.getData().get("data");
        break;
    ...//There are 15 cases like that
}

しばらくすると、ClassCastException が発生します。関連データで正しい値を送信していることを再確認しました。ハンドラーでメッセージを処理しているときに、送信者部分で上書きされていると思います。acquireMessage はグローバル メッセージ プールからメッセージを取得するためです。そのため、msg.what を確認した後、メッセージのデータ部分が送信者で変更され、ClassCastException が発生しています。

私の質問は; 私の考えは正しいですか?

4

1 に答える 1

2

メッセージは、recycle メソッドが呼び出された後にのみ再利用される必要があります。これは、handleMessage メソッドが実行された後に、Handler/Looper によって行われます。

于 2012-06-26T23:48:00.663 に答える