通过使用smack,openfire无法获得名单

Le *_*ong 6 openfire smack

我是新来的粉碎API.我正在尝试开发一个聊天应用程序,我正在尝试设置和获取存在.

当我改变用户的存在时,它的工作完全正常并且它会在Openfire服务器中反映出来.

但是当我试图获得用户的存在时,即使他在openfire中的存在显示为"可用",我也总是将状态设置为"不可用".

我使用以下代码来设置状态.

        Presence presence = new Presence(Presence.Type.available);
        presence.setStatus("Online, Programmatically!");
        presence.setPriority(24);
        presence.setMode(Presence.Mode.available);
        user.getConnection().sendPacket(presence);
Run Code Online (Sandbox Code Playgroud)

我正在使用Roster类来获得如下存在.

Roster roster = avatar.getRoster();
Collection<RosterEntry> entries = roster.getEntries();

for(RosterEntry rosterEntry: entries) {
    String user = rosterEntry.getUser();

    Presence presence = roster.getPresence(user);

    System.out.println("Presence : "+presence);                                     // 1
    System.out.println("Presence type: "+presence.getType());                // 2
    System.out.println("Presence mode: "+presence.getMode());             // 3

}
Run Code Online (Sandbox Code Playgroud)

第1行alwasys给出'不可用',第2行和第3行总是给出null

我无法弄清楚这个问题的原因.请帮我解决这个问题.

提前致谢.

And*_*tto 8

使用RosterListener是解决此问题的正确方法.代码没有理由Thread.sleep()为了使其正常工作.

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

(来源:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/roster.html)


小智 7

问题是,在立即登录后,用户的存在需要一些时间来更新.因此,在登录和调用在线好友功能之间应该有一个thread.sleep()几秒钟.然后将检索在线联系人.我做到了,并能够检索它们.登录后使用

了Thread.sleep(5000);

也用于该方法的初始化