我一直在找。但什么也找不到。我需要刷新与RosterListener的联系人状态。(离线/在线)。创建花名册时,我会:

Presence presence = roster.getPresence(r.getUser());
                if(presence.isAvailable()){
                    userstatus.add("online");
                }else{
                    userstatus.add("offline");
                }

userstatus是一个向量字符串,然后我用它生成一个字符串数组。在我的主程序中,我只是检查这个stirng数组的脱机或联机状态。但如果用户离线/在线该怎么办。我应该把听者放在哪里,以及如何使用它?

最佳答案

您可以实现一个RosterListener并使用presenceChanged()方法。下面的示例代码与Smack documentation中显示的代码完全相同。

Roster roster = con.getRoster();
roster.addRosterListener(new RosterListener() {
    // Ignored events public void entriesAdded(Collection<String> addresses) {}
    public void entriesDeleted(Collection<String> addresses) {}
    public void entriesUpdated(Collection<String> addresses) {}
    public void presenceChanged(Presence presence) {
        System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
    }
});

注意,javadoc建议不要使用change事件中接收到的状态,而是每次都检查可用的最佳状态:
要在状态更新后为用户获取当前“最佳状态”,请查询排班:
String user = presence.getFrom();
Presence bestPresence = roster.getPresence(user);

它将返回具有最高优先级和可用性的用户的状态值。

08-18 15:43