1

バックグラウンドでaddAdapter()を数回呼び出すと、メッセージが重複することがあります。たとえば、addAdapter(item1、item2、item3 ...)を呼び出すと、item1、item2、item2..が出力されます。

ExaminationItem currentAddItem = null;


private void addAdapter(ExaminationItem item)
{
    currentAddItem = item;
    addhandler.sendEmptyMessage(1);
}

private Handler addhandler = new Handler() {
    @Override
    public void handleMessage(Message msg)
    {
        switch (msg.what) {
        case 1:
            if (currentAddItem != null) {
                _adapter.add(currentAddItem);
                Log.i(getClass().getName(), "---------------------------addhandler: currentAddItem._itemName = " + currentAddItem._itemName);
            }
            break;
        default:
            break;
        }

    }
};
4

2 に答える 2

1

それは驚くべきことではありません。を呼び出すたびsendEmptyMessage()に、スレッドのメッセージキューにメッセージを追加します。アイテムをキューに追加するのではなく、ハンドラーにメッセージを送信して、ハンドラーがメッセージをcurrentAddItem処理するときの値にアクセスするだけです。メッセージを送信したときの値はわかりません。そのため、スキップされたアイテムと重複したアイテムの両方が表示される可能性があります。

于 2012-07-01T10:37:42.220 に答える
0
private void addAdapter(ExaminationItem item)
{
    Message message = addhandler.obtainMessage();
    message.what = 1;
    message.obj = item;
    addhandler.sendMessage(message);
}

private Handler addhandler = new Handler() {
    public void handleMessage(Message msg)
    {
        switch (msg.what) {
        case 1:
            if (msg.obj != null) {
                _adapter.add((ExaminationItem) msg.obj);
                examination_scanner_detail_tv.setText("detect to keep fit.");
                Log.i(getClass().getName(), "addhandler: msg.obj = " + msg.obj);
            }
            break;
        default:
            break;
        }
    }
};
于 2012-07-07T06:40:49.220 に答える