2015-02-21 4 views
2

Я создаю приложение java fx для клиента openfire chat. Я использую smack 4.1 rc1 для подключения к серверу. Я могу подключиться к серверу для отправки информации о присутствии другим пользователям и отправлять сообщения другим пользователям. Однако я не могу перебирать список.Smack Roster Записи пустые

Когда я получаю объект-реестр и отлаживаю его, он показывает карту хэша из 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 
     ("[email protected]"); 
    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()); 

имеет какой-либо один столкнулся с той же проблемой раньше?

+0

Не видите, как вы устанавливаете параметры соединения, может быть, здесь проблема. Однако взгляните на http://stackoverflow.com/questions/11214684/smack-presence-doesnt-work. – user1929959

ответ

3

Возможно, вам придется проверить, загружен ли список до вызова getEntries.

Roster roster = Roster.getInstanceFor(connection); 

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

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

загружен список, но он все равно возвращает 0 записей. –

1

благодарит за 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()); 
    } 
} 
0

Я просто решить эту проблему. Я использую OpenFire как сервер XMPP. Я проверил поле «Подписка» в списке пользователей, и оно было «Нет». После изменения «Both» он работал, и записи извлекаются.

Надеюсь, это поможет!

Смежные вопросы