2014-12-06 45 views
0

我使用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?

回答