Android可在多次调用的线程上运行
我试图用aSmack实现MUC,但似乎无法用ArrayAdapter正确更新UI。 我在我的聊天服务.java中设置了我的侦听器,如下所示: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;
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
。谢谢!这真是太棒了!将编辑问题以共享更正的代码。如果您将对您有用的答案作为新答案发布并接受,则会更好。你仍然可以投票支持埃米尔的回答。