2014-12-06 44 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?

回答