zoukankan      html  css  js  c++  java
  • PipeStateListener和PipeEventListener

    PipeStateListener和PipeEventListener

    先看二者的定义
    /**
     *  The listener interface for receiving JxtaBiDiPipe
     *  events.
     *
     *  The following example illustrates how to implement a {@link net.jxta.util.PipeStateListener}:
     *<pre><tt>
     * PipeStateListener myListener = new PipeStateListener() {
     *
     *   public void pipeEvent(int event) {
     *        if (event == PipeStateListener.PIPE_CLOSED_EVENT) {
     *          .....
     *        }
     *   }
     * }
     *
     * InputPipe pipeIn = pipe.createInputPipe(pipeAdv, myListener);
     * </tt></pre>
     *
     */
    public interface PipeStateListener extends EventListener {

        /**
         * Pipe close Event
         */
        public static final int PIPE_CLOSED_EVENT = 1;

        /**
         * Pipe opened Event
         */
        public static final int PIPE_OPENED_EVENT = 2;

        /**
         * Pipe failed Event
         */
        public static final int PIPE_FAILED_EVENT = 4;

        /**
         * Called for each pipe mode event that occurs.
         *
         * @param source the source of the event (JxtaBiDiPipe)
         * @param event The event being received.
         */
        void stateEvent(Object source, int event);

    }

    /**
     *  The listener interface for receiving JxtaBiDiPipe
     *  events.
     *
     *  The following example illustrates how to implement a {@link net.jxta.util.PipeEventListener}:
     *<pre><tt>
     * PipeEventListener myListener = new PipeEventListener() {
     *
     *   public void pipeEvent(int event) {
     *        if (event == JxtaBiDiPipe.PIPE_CLOSED_EVENT) {
     *          .....
     *        }
     *   }
     * }
     *
     * InputPipe pipeIn = pipe.createInputPipe(pipeAdv, myListener);
     * *</tt></pre>
     *
     */
    public interface PipeEventListener extends EventListener {

        /**
         * Called for each pipe message event that occurs.
         *
         * @param event The event being received.
         */
        void pipeEvent(int event);

    }
    上述两个监听器都用来监听管道事件。从字面上看,一个用于监听管道状态(实际上也是事件,),一个用于监听管道事件。
    在PipeStateListener中定义了三种管道事件,分别是
    管道关闭事件/管道打开事件/管道失败事件(该事件目前没有使用)
    同时注意到JxtaBiDiPipe类中也定义了一个管道关闭事件
    /**
    * Pipe close Event
    */
    public static final int PIPE_CLOSED_EVENT = 1;


    再看JxtaBiDiPipe的notifyListeners方法,该方法会在适当的时候通知监听器。
        private void notifyListeners(int event) {
            try {
                if (eventListener != null) {
                    eventListener.pipeEvent(event);
                } else if (stateListener != null) {
                    stateListener.stateEvent(this, event);
                }
            } catch (Throwable th) {
                if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
                    LOG.log(Level.FINE, "error during pipe event callback", th);
                }
            }
        }
    从该方法的定义中可以看出,如果注册了事件监听器(PipeEventListener),则会通知事件监听器,否则才会通知状态监听器(PipeStateListener)。
    因此,如果二者都注册了的话,只有事件监听器会收到通知,而状态监听器是不会收到任何通知的。

    在JxtaBiDiPipe类中共有三处调用了notifyListeners方法(2.7中,2.5、2.6中只有两处),其中
    一处用于管道异常关闭:
    //Pipe broken, just notify close and deal later...
    pipe.notifyListeners(PipeStateListener.PIPE_CLOSED_EVENT);

    一处用于管道正常关闭(通过调用close方法):
    notifyListeners(PIPE_CLOSED_EVENT);

    一处用于管道打开事件:
    notifyListeners(PipeStateListener.PIPE_OPENED_EVENT);


    第一处和第三处使用的是PipeStateListener定义的事件,而第二处使用的是JxtaBiDiPipe类中定义的事件。
    注意PipeStateListener和JxtaBiDiPipe虽然都定义了PIPE_CLOSED_EVENT,但二者的值相同,都是1。

    总结:在管道事件的监听方面,目前的JXSE的实现有些混乱。实际处理的时候只要注册其中一个监听器即可。而PipeStateListener定义的事件比较全,所以可以使用PipeStateListener中定义的事件进行处理,PipeStateListener的回调函数中还多了一个事件源的信息,所以建议统一使用PipeStateListener,而忽略PipeEventListener。







  • 相关阅读:
    C# 数据的序列化存取
    C# 移动端与PC端的数据交互
    C# Socket 简易的图片传输
    C# Socket学习笔记二
    C# Socket学习笔记一
    unity 小地图的制作
    Unity Layout碰撞检测
    Unity sqlite学习笔记一
    玩家信息血条及伤害值随主角移动
    C# 热水器
  • 原文地址:https://www.cnblogs.com/cuizhf/p/2216325.html
Copyright © 2011-2022 走看看