2012-07-01 2 views
0

백그라운드에서 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; 
     } 

    } 
}; 

답변

1

놀라운 것은 아닙니다. sendEmptyMessage()으로 전화 할 때마다 스레드의 메시지 대기열에 메시지를 추가합니다. 큐에 항목을 추가하지 않고 핸들러가 메시지를 처리 ​​할 때 currentAddItem의 값이 무엇이든간에 액세스하기 위해 핸들러에 메시지를 보냈습니다. 그것은 당신이 메시지를 보낸 당시의 가치가 무엇인지 알지 못합니다. 따라서 건너 뛴 항목과 중복 된 항목을 모두 볼 수 있습니다.

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; 
     } 
    } 
}; 
관련 문제