XMPP系列之Smack(4.1.3)(二)获取好友分组

XMPP系列之Smack(4.1.3)(一)登录服务器
XMPP系列之Smack(4.1.3 )(三)获取已加入的聊天室列表
XMPP系列之Smack(4.1.3 )(四)创建聊天室
接着上一篇,要实现类似QQ好友分组的功能很简单,从服务器读取到好友分组以及各个分组内的成员。
首先还是要通过连接管理器单例来获得连接类,前一章已经讲解了如何配置并初始化XMPPTCPConnection,在这里要说明一下如何创建这个单例管理类,我们通过加双重锁的方式来创建这个类,方法如下

public static XMPPConnectionManager getInstance() {   
     if (connectionManager == null) {        
          synchronized (XMPPConnectionManager.class) {
            if (connectionManager == null) {
                connectionManager = new XMPPConnectionManager();
            }                           
          }   
   }
    return connectionManager;
}

这样可以保证在加锁的情况下防止对象为空。

通过管理类获取连接对象

public XMPPTCPConnection getConnection() {
    if (connection == null) {
        throw new RuntimeException("请先初始化连接");
    }
    return connection;
}

服务器上所有的注册用户都通过Roster来获得,获取名单对象Roster的方法和之前有所差异,之前是通过new一个Roster对象,现在通过一个Roster单例获取

public static synchronized Roster getInstanceFor(XMPPConnection connection) {
    Roster roster = INSTANCES.get(connection);
    if (roster == null) {
        roster = new Roster(connection);        
        INSTANCES.put(connection, roster);
    }
    return roster;
}

我们直接注入一个连接对象即可

Roster roster = Roster.getInstanceFor(connection);

如果有延迟还可以来一个判断条件

if (!roster.isLoaded()) {
    try {
        roster.reloadAndWait();
    } catch (SmackException.NotLoggedInException | SmackException.NotConnectedException e) {
        e.printStackTrace();
    }
}

有了名单对象后就可以获取所有的分组以及所有的好友了,首先获取服务器上创建的所有分组:

Collection<RosterGroup> rosterEntries = roster.getGroups();

接下来通过遍历来取得我们需要的Group对象

for (RosterGroup rosterGroup : rosterEntries) {
    String groupName = rosterGroup.getName();
    int count = rosterGroup.getEntryCount();
    FriendGroup mainGroup = new FriendGroup();
    mainGroup.setName(groupName);
    mainGroup.setCount(String.valueOf(count));
    groupList.add(mainGroup);

这里我创建了一个model(FriendGroup)来取得我所需要的组名和组内的好友数量,然后通过rosterGroup获取到组内的好友

List<RosterEntry> rosterEntryList = rosterGroup.getEntries();
List<FriendEntity> tempChildList = new ArrayList<>();
for (int i = 0; i < rosterEntryList.size(); i++) {
    RosterEntry rosterEntry = rosterEntryList.get(i);
    FriendEntity mainChild = new FriendEntity();
    Presence presence = roster.getPresence(rosterEntry.getUser());
    Log.e("状态", "presence=" + presence);
    Log.e("状态", "presence status=" + presence.getStatus());
    Log.e("状态", "presence mode=" + presence.getMode());
    if (presence.isAvailable()) {
        mainChild.setPresence("[在线]");
    } else {
        mainChild.setPresence("[离线]");
    }
    mainChild.setName(rosterEntry.getName());
    mainChild.setJid(rosterEntry.getUser());
    tempChildList.add(mainChild);
}
childList.add(tempChildList);

获取好友在线状态是通过获取到的Presence对象来判断的,下面是smack源码描述:

Paste_Image.png

到此获取分组及好友就搞定了,如何显示大家各显神通吧!
下一章会讲述如何获取聊天室也就是QQ的群列表!再见!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Smack库概述     Smack是一个开源、易用的XMPP/Jabber客户端库,它使用Java语言开发,...
    AndryYu阅读 6,309评论 2 13
  • 关于XMPP最权威的讲解:http://www.jabbercn.org/RFC3920(这个才是最权威的,下面文...
    随风飘荡的小逗逼阅读 1,543评论 1 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • XMPP简介 原理 概述XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(I...
    乐小文阅读 6,246评论 1 9
  • down下来的代码,会报错。。。 [!] Error installing LeanCloud[!] /usr/b...
    sky_deprecated阅读 1,634评论 0 0