2013-03-05 1 views
4

Я пытаюсь реализовать MultiUserChat с smackx api.Как узнать комнату в помещении, когда кто-то присоединился или оставил MultiUserChat в smackx?

До сих пор мне удалось создать новую комнату MultiUserChat, присоединиться к ней и отправить приглашения. Моя проблема на данный момент заключается в том, как узнать, кто в чате, если кто-то присоединился к чату или оставил его. Я думал, что добавление присутствия слушателя в комнату чата может сделать трюк:

muc.addParticipantListener(new PacketListener() { 

    @Override 
    public void processPacket(Packet packet) { 
     System.out.println("user count changed, now:" + muc.getOccupcantsCount()); 
    } 
}); 

Javadoc для addParticipantListener состояний

Добавляет пакет слушатель, который будет уведомлен о каких-либо новых пакетах Presence направляемых на Групповой чат. Использование прослушивателя - это подходящий способ узнать, когда список пассажиров должен быть перезагружен из-за каких-либо изменений.

Так что я думал, что это сработает. Однако в рамках метода processPacketmuc.getOccupantsCount(), а также muc.getOccupants() оба значения возвращаются перед вызовом processPacket. Так что, если есть только один пользователь в чате, а другие присоединяется, выход будет

пользователя COUNT изменился, теперь: 1

Если два пользователя, а другие присоединяются, выход является

пользователь COUNT изменился, теперь: 2

и если есть три пользователя и один листья, то из пут

Количество пользователей изменилось, теперь: 3

Соответственно, muc.getOccupants() не даст мне пользователю, который только что присоединился, когда вызывается в processPacket, и до сих пор дает мне пользователю, что только что вышел.

Как я могу эффективно узнать, кто в данный момент находится в чате, в пределах processPacket?

+0

У меня проблема, как добавить добавление приглашения для приглашения без наличия комнаты (как мы можем инициализировать MultiuserChat, если у вас нет имени комнаты?) –

ответ

3

Вы не можете. Не в пределах PacketListener и muc.getOccupantsCount().

Число пассажиров также determined by using a PacketListener within smackx. И не гарантируется, что этот PacketListener запускается до вас и, следовательно, имеет шанс обновить счетчик пассажиров.

Один из способов решения проблемы - проверить пакет присутствия и перекрестно проверить его с помощью текущего списка участников. В основном это делается так же, как встроенный прослушиватель присутствия. Или вы можете искусственно задержать действие так, чтобы все PacketListeners имели шанс закончить.

Я создал SMACK-424 для отслеживания этой проблемы в Smack.

+1

Благодарим вас за это. В качестве обходного пути я теперь использую пакет '(Присутствие) .isAvailable()' для проверки статуса пользователя в 'PacketListener' и обновления внутреннего набора имен пользователей соответственно. – Haf