【问题标题】:Smack Roster Entries are nullSmack 名册条目为空
【发布时间】:2015-04-22 23:17:52
【问题描述】:

我正在为 openfire 聊天客户端创建一个 java fx 应用程序。 我正在使用 smack 4.1 rc1 连接到服务器。 我能够连接到服务器向其他用户发送存在信息并向其他用户发送消息。 但是我无法遍历名册。

当我获得名册对象并对其进行调试时,它会显示 3 个名册条目的哈希映射,这意味着名册正在加载到名册对象中。但是,当我使用roster.getentries 方法将其存储到名册条目的Collection 中时,它显示0 对象。即使roster.getentriescount() 方法返回 0 虽然我可以在调试视图中看到花名册用户名

try {
    config = XMPPTCPConnectionConfiguration.builder()
            .setUsernameAndPassword(mUserName+ "@" + Domain, mPassword)
            .setServiceName(HostName)
            .setHost(HostName)
            .setPort(PortName)
            .setResource(Resource)
            .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
            .build();
    mXmppConnection = new XMPPTCPConnection(config);

    mXmppConnection.connect();
    mXmppConnection.login();
   // Presence presence=new Presence();
    Presence presence ;
    if(mPresence) presence = new Presence(Presence.Type.available);
    else presence = new Presence(Presence.Type.unavailable);
    presence.setStatus("On Smack");
    XMPPConnection conn=(XMPPConnection) mXmppConnection;
    Chat chat = ChatManager.getInstanceFor(mXmppConnection).createChat
        ("monika@ipaddress");
    chat.sendMessage("Howdy from smack!");

    // Send the packet (assume we have a XMPPConnection instance called "con").
    mXmppConnection.sendPacket(presence);

    System.out.println("Connected successfully");
    Roster roster = Roster.getInstanceFor(conn);
    Collection<RosterEntry> entries = roster.getEntries();

    int i=0;
    for (RosterEntry entry : entries) {
        System.out.println(entry);
                i++;
    }
    System.out.println("Rosters Count - "+ i+ roster.getEntryCount());

有没有人遇到过同样的问题?

【问题讨论】:

标签: javafx smack


【解决方案1】:

您可能需要在调用 getEntries 之前检查是否加载了名册。

Roster roster = Roster.getInstanceFor(connection);

if (!roster.isLoaded()) 
    roster.reloadAndWait();

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

【讨论】:

  • 名册已加载,但仍返回 0 个条目。
【解决方案2】:

感谢Deepak Azad

完整代码

public void getRoaster(final Callback<Collection<RosterEntry>> callback) {
    final Roster roster = Roster.getInstanceFor(connection);
    if (!roster.isLoaded())
    try {
        roster.reloadAndWait();
    } catch (SmackException.NotLoggedInException | SmackException.NotConnectedException | InterruptedException e) {
        e.printStackTrace();
    }

    Collection<RosterEntry> entries = roster.getEntries();
    for (RosterEntry entry : entries) {
        android.util.Log.d(AppConstant.PUBLIC_TAG, entry.getName());
    }
}

【讨论】:

    【解决方案3】:

    我刚刚解决了这个问题。我使用 OpenFire 作为 XMPP 服务器。我检查了名册用户中的“订阅”字段,它是“无”。在通过“Both”更改它之后,它起作用了,并且正在获取条目。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 2015-06-06
      • 2015-08-04
      • 2013-11-20
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多