Smack开发总结 (五)处理Packet的两种方式

《Smack开发总结 (五)处理Packet的两种方式》
转载请注明来自 傻小孩b_移动开发(http://www.jianshu.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("[email protected]"));
// 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共勉,写给在成长路上奋斗的你

你可能感兴趣的:(Smack开发总结 (五)处理Packet的两种方式)