Android可在多次调用的线程上运行

Android可在多次调用的线程上运行,android,android-arrayadapter,asmack,android-handler,Android,Android Arrayadapter,Asmack,Android Handler,我试图用aSmack实现MUC,但似乎无法用ArrayAdapter正确更新UI。 我在我的聊天服务.java中设置了我的侦听器,如下所示: connection.addPacketListener(new MessageListener(), new PacketFilter() { public boolean accept(Packet packet) { Message msg = (Message) packet;

我试图用aSmack实现MUC,但似乎无法用ArrayAdapter正确更新UI。 我在我的聊天服务.java中设置了我的侦听器,如下所示:

connection.addPacketListener(new MessageListener(), new PacketFilter() {
            public boolean accept(Packet packet) {
                Message msg = (Message) packet;
                return msg.getBody() != null;
            }});
private class MessageListener implements PacketListener {
    /**
     * Constructor.
     */
    public MessageListener() {
    }

    public void processPacket(Packet packet) {
        if(packet instanceof Message ) {
            Message message = (Message) packet;

            android.os.Message aosMessage = new android.os.Message();
            aosMessage.what = message.getType().ordinal();
            aosMessage.obj = message;
            messageHandler.handleMessage(aosMessage);

        }
    }

}
我的listener类如下所示:

connection.addPacketListener(new MessageListener(), new PacketFilter() {
            public boolean accept(Packet packet) {
                Message msg = (Message) packet;
                return msg.getBody() != null;
            }});
private class MessageListener implements PacketListener {
    /**
     * Constructor.
     */
    public MessageListener() {
    }

    public void processPacket(Packet packet) {
        if(packet instanceof Message ) {
            Message message = (Message) packet;

            android.os.Message aosMessage = new android.os.Message();
            aosMessage.what = message.getType().ordinal();
            aosMessage.obj = message;
            messageHandler.handleMessage(aosMessage);

        }
    }

}
现在的问题如下; 首先,我尝试通过处理程序更新UI(处理程序在我的ChatActivity.java中定义):

但在用户端引入交互之前,这不会更新UI。 在进行了一点web挖掘之后,我意识到我需要使用post(或RUNNUITHREAD)方法来实现这一点,因此我尝试:

private final Handler messageHandler = new Handler() {
private Message chatMessage;

@Override
public void handleMessage(final android.os.Message msg) {
    chatMessage = (Message) msg.obj; 
    
    this.post(new Runnable() {
        public void run() {
            if(Message.Type.values()[msg.what].equals(Message.Type.groupchat)) {
                conversationArrayAdapter.add("Received group message:  " + chatMessage.getBody());
                conversationArrayAdapter.notifyDataSetChanged();
            } else if (Message.Type.values()[msg.what].equals(Message.Type.chat)) { 
                conversationArrayAdapter.add("Received private message:  " + chatMessage.getBody());
                conversationArrayAdapter.notifyDataSetChanged();
            }
        }
    });
}
};
但是现在run()方法被调用了多次(在调试时确认),UI被更新为看似随机的相同消息(每条消息的重复次数不同,但所有消息都会显示)

这是我的第一个android应用程序(但我是一名java开发人员),我很确定我在这里的架构方面做了一些错误的事情。任何帮助(最好是详细的,包括代码示例和/或参考文档的正确区域)都将不胜感激

提前谢谢

在@Emil的回答后更正了工作片段
不要直接调用
handleMessage

messageHandler.handleMessage(aosMessage);

您应该从消息上给定的
处理程序
设置目标(处理程序)
获取消息,然后调用消息上的
sendToTarget()
,使其由
处理程序
发送和处理。如果您正确地实现了
处理程序
,则不需要使用
post

谢谢!这真是太棒了!将编辑问题以共享更正的代码。如果您将对您有用的答案作为新答案发布并接受,则会更好。你仍然可以投票支持埃米尔的回答。