【问题标题】:Android - XMPP asmack PacketListener throws CalledFromWrongThreadException hierarchy viewAndroid - XMPP asmack PacketListener 抛出 CalledFromWrongThreadException 层次结构视图
【发布时间】:2014-12-06 22:45:14
【问题描述】:

我已经使用 asmack 4.0.5 在 Android 上构建了一个小 XMPP 应用程序。我想实现聊天伙伴的存在状态。我可以在 Eclipse 中使用日志记录功能获取信息,但我无法在聊天 UI 上显示/更新它。我有 2 个侦听器:PacketListener 对传入消息做得很好,RosterListener 能够接收存在状态,但无法在 UI 上显示。 PacketListener 是这样构建的:

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?

【问题讨论】:

    标签: android multithreading xmpp smack asmack


    【解决方案1】:

    availableMode.setText(getPresenceStatus(...)); 包装在一个可运行文件中,然后使用post(…) 在 UI 线程上进行 UI 更新。

    http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)

    View#post 将 Runnable 添加到消息队列中。 runnable 将在用户界面线程上运行。

    availableMode.post(new Runnable() { @Override public void run() { availableMode.setText(getPresenceStatus(...)); } });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多