Android处理程序读取UI /主线程数据

时间:2015-09-26 01:56:25

标签: android process handler

具有成员arraylist的活动。 此arraylist将由活动编写并由其/ activity处理程序读取。 处理程序读取的数据有时是正确的,有时也是错误的。这是因为当处理程序正在读取时,活动写入的数据不会同步。

我注意到活动和处理程序处于不同的进程中,甚至处理程序也是由活动创建的。但是处理程序由另一个进程调用。

如何使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()正在主进程中运行。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用Vector而不是Arraylist。它的所有方法都是同步的,因此它是“线程安全的”。