2015-09-26 54 views
0

具有成員數組列表的活動。 此數組列表將按活動編寫並由其活動處理程序讀取。 處理程序讀取的數據有時會正確,有時會錯誤。這是因爲當處理程序正在讀取時,活動寫入的數據未同步。Android處理程序讀取UI /主線程數據

我注意到活動和處理程序在不同的過程中,即使處理程序是由活動創建的。但處理程序被另一個進程調用。

如何使arraylist數據同步/一致?謝謝。

代碼的活動:在活動

private Vector<XMPPConnectionInClientCallback> mCallbackList = new Vector<>(); 

public interface XMPPConnectionInClientCallback { 
    void connected(int data); 
    void logIned(int data); 
    void disconnected(String data); 
} 

public void addCallback(XMPPConnectionInClientCallback callback) { 
    Log.e("connectionclient", "addone"); 
    mCallbackList.add(callback); 
    String strI = String.valueOf(mCallbackList.size()); 
    Log.e("connectionclient", strI); 
} 

處理程序:

final Messenger mMessenger = new Messenger(new IncomingHandler()); 

class IncomingHandler extends Handler { 
    @Override 
    public void handleMessage(Message msg) { 
     //synchronized(mCallbackList) { 
     //get data message from Service Process 
     int MSGValue = msg.what; 
     switch (msg.what) { 
      case XmppService.E_CONNECTION_MESSENGER_VALUE: 
       try { 
        //callback here 
        String strI = String.valueOf(mCallbackList.size()); 
        Log.e("connectionclient size", strI); 
        for (int i = 0; i < mCallbackList.size(); i++) { 
         mCallbackList.get(i).connected(MSGValue); 
        } 
       break; 

我打電話的addCallback()第一個對象添加到mCallbackList,再經過一段時間的服務過程中會發送消息給處理程序。處理程序將從mCallbackList中讀取對象。有時mCallbackList有對象,有時候不是。我注意到處理程序正在服務進程中運行。而addCallback()在主進程中運行。

+0

請顯示一些關於數組列表讀/寫的代碼。 'handleMessage'中的 –

+0

用'Thread.currentThread'調用'Log.d',你看到了什麼?有點像'Thread [main,5,main]'? – pskink

+0

我想這是一個系統錯誤!最後,我改變爲另一種解決方案。我測試了幾個案例。如果處理程序在另一個進程中,所有這些情況都會導致數據不一致。如果在相同的過程中(不同的線程),沒有問題。 – xhsoldier

回答

0

您可以嘗試使用Vector而不是Arraylist。它的所有方法都是同步的,因此它是「線程安全的」。

+0

對不起,我確實使用過矢量。 – xhsoldier