我使用asmack 4.0.5在Android上構建了一個XMPP應用程序。我想實現聊天夥伴的在線狀態。我可以在Eclipse中使用日誌記錄功能獲取信息,但我無法在Chatting-UI上顯示/更新它。我有2個Listener:PacketListener
這對傳入消息有好處,並且RosterListener
能夠接收到狀態,但無法在UI上顯示。該PacketListener
是建立這樣:Android - XMPP asmack PacketListener引發CalledFromWrongThreadException層次結構視圖
PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
message = (Message) packet;
if (message.getBody() != null) {
String fromName = StringUtils.parseBareAddress(message
.getFrom());
messages.add(message.getBody());
listMessage.add(new MessageData(message.getBody()));
mHandler.post(new Runnable() {
@SuppressLint("NewApi")
public void run() {
//listview = chatmessages which are updated every time I receive a message
listview.invalidateViews();
}
});
}
}
}, filter);
然後,我有我的RosterListener
:
final Roster roster = connection.getRoster();
roster.addRosterListener(new RosterListener() {
@Override
public void presenceChanged(final Presence presence) {
presenceUser = presence.getFrom();
Presence availability = roster.getPresence(presenceUser);
Mode userMode = availability.getMode();
availableMode.setText(getPresenceStatus(...)); // Here is where a TextView 'availableMode' should be updated, but I get the Error shown below.
}
@Override
public void entriesUpdated(Collection<String> arg0) {
}
@Override
public void entriesDeleted(Collection<String> arg0) {
}
@Override
public void entriesAdded(Collection<String> arg0) {
}
});
每次我RosterListener要更新UI,我得到以下異常:
E/XMPPConnection(1314): Exception in packet listener
E/XMPPConnection(1314):android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
如何使用RosterListener中的傳入呈現信息獨立更新UI?