XMPP系列之Smack(4.1.3)(一)登錄服務(wù)器
XMPP系列之Smack(4.1.3 )(三)獲取已加入的聊天室列表
XMPP系列之Smack(4.1.3 )(四)創(chuàng)建聊天室
接著上一篇挤聘,要實(shí)現(xiàn)類(lèi)似QQ好友分組的功能很簡(jiǎn)單昵仅,從服務(wù)器讀取到好友分組以及各個(gè)分組內(nèi)的成員。
首先還是要通過(guò)連接管理器單例來(lái)獲得連接類(lèi)挺身,前一章已經(jīng)講解了如何配置并初始化XMPPTCPConnection
缩筛,在這里要說(shuō)明一下如何創(chuàng)建這個(gè)單例管理類(lèi)消略,我們通過(guò)加雙重鎖的方式來(lái)創(chuàng)建這個(gè)類(lèi),方法如下
public static XMPPConnectionManager getInstance() {
if (connectionManager == null) {
synchronized (XMPPConnectionManager.class) {
if (connectionManager == null) {
connectionManager = new XMPPConnectionManager();
}
}
}
return connectionManager;
}
這樣可以保證在加鎖的情況下防止對(duì)象為空瞎抛。
通過(guò)管理類(lèi)獲取連接對(duì)象
public XMPPTCPConnection getConnection() {
if (connection == null) {
throw new RuntimeException("請(qǐng)先初始化連接");
}
return connection;
}
服務(wù)器上所有的注冊(cè)用戶(hù)都通過(guò)Roster
來(lái)獲得艺演,獲取名單對(duì)象Roster
的方法和之前有所差異,之前是通過(guò)new一個(gè)Roster
對(duì)象桐臊,現(xiàn)在通過(guò)一個(gè)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;
}
我們直接注入一個(gè)連接對(duì)象即可
Roster roster = Roster.getInstanceFor(connection);
如果有延遲還可以來(lái)一個(gè)判斷條件
if (!roster.isLoaded()) {
try {
roster.reloadAndWait();
} catch (SmackException.NotLoggedInException | SmackException.NotConnectedException e) {
e.printStackTrace();
}
}
有了名單對(duì)象后就可以獲取所有的分組以及所有的好友了胎撤,首先獲取服務(wù)器上創(chuàng)建的所有分組:
Collection<RosterGroup> rosterEntries = roster.getGroups();
接下來(lái)通過(guò)遍歷來(lái)取得我們需要的Group對(duì)象
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);
這里我創(chuàng)建了一個(gè)model(FriendGroup)來(lái)取得我所需要的組名和組內(nèi)的好友數(shù)量,然后通過(guò)rosterGroup獲取到組內(nèi)的好友
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("狀態(tài)", "presence=" + presence);
Log.e("狀態(tài)", "presence status=" + presence.getStatus());
Log.e("狀態(tài)", "presence mode=" + presence.getMode());
if (presence.isAvailable()) {
mainChild.setPresence("[在線(xiàn)]");
} else {
mainChild.setPresence("[離線(xiàn)]");
}
mainChild.setName(rosterEntry.getName());
mainChild.setJid(rosterEntry.getUser());
tempChildList.add(mainChild);
}
childList.add(tempChildList);
獲取好友在線(xiàn)狀態(tài)是通過(guò)獲取到的Presence
對(duì)象來(lái)判斷的断凶,下面是smack源碼描述:
到此獲取分組及好友就搞定了伤提,如何顯示大家各顯神通吧!
下一章會(huì)講述如何獲取聊天室也就是QQ的群列表认烁!再見(jiàn)V啄小!砚著!