2015-09-26 1 views
0

Активность, которая имеет членский архаист. Этот arraylist будет записан по активности и прочитан обработчиком/обработчиком. Данные, прочитанные обработчиком, иногда правильные, а иногда и неправильные. Это связано с тем, что данные, записанные активностью, не синхронизируются при чтении обработчиком.Обработчик Android читает данные пользовательского интерфейса/основной нити

Я заметил, что активность и обработчик находятся в другом процессе, даже обработчик создается действием. Но обработчик вызван другим процессом.

Как сделать данные 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

Просьба показать код о чтении/записи архивариуса. –

+0

в 'handleMessage' вызывать' Log.d' с 'Thread.currentThread', что вы видите? что-то вроде 'Thread [main, 5, main]'? – pskink

+0

Я бы предположил, что это ошибка системы !!! Наконец, я перехожу к другому решению. Я проверил несколько случаев. Все эти случаи приведут к несогласованности данных, если обработчик находится в другом Процессе. Если в том же процессе (другой поток), проблем нет. – xhsoldier

ответ

0

Вы можете использовать Vector вместо Arraylist. Он сделан «поточно-безопасным», благодаря тому, что все его методы синхронизируются.

+0

Извините, я использовал вектор. – xhsoldier