《Smack开发总结 (五)处理Packet的两种方式》
转载请注明来自 傻小孩b_移动开发(//www.greatytc.com/users/d388bcf9c4d3)喜欢的可以关注我,不定期总结文章!您的支持是我的动力哈!
在Smack中,Packet是作为一个消息的载体。在心跳包、IQ包、特殊消息格式应用中相当广泛。这里还需要注意的一点,在Smack 4.1版本之后,Packet的所有入口,都被标记为@Deprecated。反之取而代之是stanza
接下来是正文
处理Packet的两种方式
Smack中提供了两种方式处理收到的packet
- org.jivesoftware.smack.PacketCollector —— 一个让您同步等待新packet的类。
- org.jivesoftware.smack.StanzaListener —— 一个异步通知您引入的packet的接口。
从源码解释,可以了解到。StanzaListener用于事件样式的变成,而PacketCollector手机去可以作为一个做轮询和阻塞操作的结果队列。因此,如果想直接对到来的Stanza,例如心跳包,可以使用StanzaListener监听器;而当我们想等待一个特殊的packet到来的时候,例如指定类型的推送,可以使用PacketCollector收集器。
在涉及到这两个入口的初始化的时候,这里也需要讲到一个机制--过滤器Filter
- org.jivesoftware.smack.filter.PacketFilter —— 4.1之后过期
- org.jivesoftware.smack.packet.Stanza.StanzaFilter —— 4.1版本后替换成StanzaFilter
(一)举例收集器和监听器的实例化
// 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中有很多已经定义的过滤器集,如果需要自己自定义的话,就实现StanzaFilter创建自己的过滤器,默认有如下过滤器:
- PacketTypeFilter ——特定类的packet过滤器。(4.1版本后 StanzaTypeFilter代替)
- PacketIDFilter ——含有特定packet ID的packet过滤器。(4.1版本后 StanzaIdFilter代替)
- ThreadFilter ——含有特定线程ID的消息packet过滤器。(4.1版本后 StanzaIdFilter代替)
- ToContainsFilter ——发送到特定地址的packet过滤器。
- FromContainsFilter ——来自特定地址的packet过滤器。
- PacketExtensionFilter ——含有特定packet扩充的packet过滤器。(4.1版本后 StanzaExtensionFilter代替)
- AndFilter ——实现两个过滤器的逻辑“与”操作。
- OrFilter —— 实现两个过滤器的逻辑“或”操作。
- NotFilter ——实现一个过滤器的逻辑“非”操作。
有兴趣的可以一起交流哈
傻小孩b mark共勉,写给在成长路上奋斗的你