《Smack開發(fā)總結(jié) (五)處理Packet的兩種方式》
轉(zhuǎn)載請注明來自 傻小孩b_移動開發(fā)(http://www.reibang.com/users/d388bcf9c4d3)喜歡的可以關(guān)注我饮睬,不定期總結(jié)文章回论!您的支持是我的動力哈银室!
在Smack中,Packet是作為一個消息的載體拾稳。在心跳包、IQ包、特殊消息格式應(yīng)用中相當廣泛呕乎。這里還需要注意的一點示罗,在Smack 4.1版本之后惩猫,Packet的所有入口,都被標記為@Deprecated蚜点。反之取而代之是stanza
接下來是正文
處理Packet的兩種方式
Smack中提供了兩種方式處理收到的packet
- org.jivesoftware.smack.PacketCollector —— 一個讓您同步等待新packet的類轧房。
- org.jivesoftware.smack.StanzaListener —— 一個異步通知您引入的packet的接口。
從源碼解釋绍绘,可以了解到奶镶。StanzaListener用于事件樣式的變成,而PacketCollector手機去可以作為一個做輪詢和阻塞操作的結(jié)果隊列陪拘。因此厂镇,如果想直接對到來的Stanza,例如心跳包左刽,可以使用StanzaListener監(jiān)聽器捺信;而當我們想等待一個特殊的packet到來的時候,例如指定類型的推送欠痴,可以使用PacketCollector收集器迄靠。
在涉及到這兩個入口的初始化的時候,這里也需要講到一個機制--過濾器Filter
- org.jivesoftware.smack.filter.PacketFilter —— 4.1之后過期
- org.jivesoftware.smack.packet.Stanza.StanzaFilter —— 4.1版本后替換成StanzaFilter
(一)舉例收集器和監(jiān)聽器的實例化
// Create a packet filter to listen for new messages from a particular
// user. We use an AndFilter to combine two other filters._
StanzaFilter filter = new AndFilter(new StanzaTypeFilter(Message.class),
new FromContainsFilter("mary@jivesoftware.com"));
// Assume we've created an XMPPConnection name "connection".
// First, register a packet collector using the filter we created.
PacketCollector myCollector = connection.createPacketCollector(filter);
// Normally, you'd do something with the collector, like wait for new packets.
// Next, create a packet listener. We use an anonymous inner class for brevity.
PacketListener myListener = new PacketListener() {
**public** **void** processPacket(Packet packet) {
// Do something with the incoming packet here._
}
};
// Register the listener._
connection.addPacketListener(myListener, filter);
(二)標準過濾
Smack中有很多已經(jīng)定義的過濾器集斋否,如果需要自己自定義的話梨水,就實現(xiàn)StanzaFilter創(chuàng)建自己的過濾器,默認有如下過濾器:
- PacketTypeFilter ——特定類的packet過濾器茵臭。(4.1版本后 StanzaTypeFilter代替)
- PacketIDFilter ——含有特定packet ID的packet過濾器疫诽。(4.1版本后 StanzaIdFilter代替)
- ThreadFilter ——含有特定線程ID的消息packet過濾器。(4.1版本后 StanzaIdFilter代替)
- ToContainsFilter ——發(fā)送到特定地址的packet過濾器旦委。
- FromContainsFilter ——來自特定地址的packet過濾器奇徒。
- PacketExtensionFilter ——含有特定packet擴充的packet過濾器。(4.1版本后 StanzaExtensionFilter代替)
- AndFilter ——實現(xiàn)兩個過濾器的邏輯“與”操作缨硝。
- OrFilter —— 實現(xiàn)兩個過濾器的邏輯“或”操作摩钙。
- NotFilter ——實現(xiàn)一個過濾器的邏輯“非”操作。
有興趣的可以一起交流哈
傻小孩b mark共勉查辩,寫給在成長路上奮斗的你