messagecenter

Introduction: 消息中心
More: Author   ReportBugs   
Tags:

支持消息多订阅、不依赖上下文、集成了 socket 通讯(收发 socket 消息与普通消息无区别)、使用者可以实现 socket 拦截器实现数据自由拆装和重连机制

更新日志

【1.0.11】 2018-12-14

1.修复自动重连可能引发并发的问题

2.修改 SocketInterceptor 拦截器的 receiveServerMsg 和 connectState 方法为在 UI 线程执行

【1.0.5】 2018-12-11

1.修改 SocketInterceptor 的 receiveServerMsg 方法,不再要求返回值

【1.0.4】 2018-12-10

1.新增 Socket 自动重连,重连机制基于屏幕广播、网络广播及定时器,经过多个项目验证,已稳定可靠!

2.通过 MessageCenter.setSocketCheckIntervalTime(10 * 1000)设置定时器循环时间

3.简化老版本中的 SocketInterceptor 拦截器,除 receiveServerMsg 方法以外都为可选实现

使用方式

         //初始化消息中心
        //socket 连接模块集成的是 netty 框架
        MessageCenter.create(context)
                .setSocketCheckIntervalTime(10 * 1000)      //设置 socket 自检定时器时间,默认为 10 秒
                .host("192.168.0.1").port(8088)             //设置 socket 连接参数,不需要使用 socket 也可以不设置
                .socketInterceptor(new MySocketInterceptor());//绑定 socket 拦截器,不需要使用 socket 也可以不设置

        //连接 socket,如果已经连上 socket,会自动先断开再连接;不需要使用 socket 也可以不调用
        MessageCenter.connectSocket();
        //断开 socket 连接;不需要使用 socket 也可以不调用
        MessageCenter.disConnectSocket();

        //发送应用内消息
        Msg insideMsg = Msg.ini("insideTag", new Object());//"insideTag"是订阅消息的标识,new Object()是携带的数据包,可以是任意类型
        insideMsg.destination(Msg.APP_INSIDE);//APP_INSIDE 为默认值,可以不用设置,如需发送到服务器则使用 APP_OUTSIDE
        MessageCenter.sendMessage(insideMsg);

        //发送到应用外的消息
        Msg outSideMsg = Msg.ini("outsideTag", new Object());
        outSideMsg.destination(Msg.APP_OUTSIDE);
        MessageCenter.sendMessage(outSideMsg);

        //Listener 方式创建订阅者
        MessageHandler insideMessageHandler = new MessageHandler("insideTag",
                //收到消息订阅
                new MHanderReceiveListener() {
                    @Override
                    public void receivedMsg(Msg message) {}
                },
                //发送消息订阅,可监听发送状态,主要用于处理发送 socket 消息回执,不是必须实现的方法
                new MHanderSendListener() {
                    @Override
                    public void sendMsgReturn(Msg message, int sendState) {}
                });
        //Listener 方式注册订阅者
        MessageCenter.registMessageHandler(insideMessageHandler);
        //Listener 方式注销订阅者。如不再使用一定要记得注销
        MessageCenter.unRegistMessageHandler(insideMessageHandler);

        //注解方式注册订阅者
        MessageCenter.registMessageHandler(this);
        //注解方式注销订阅者。如不再使用一定要记得注销
        MessageCenter.unRegistMessageHandler(this,"outsideTag");

支持注解

 /**
     * 注解方式绑定订阅者
     * 发送 socket 消息监听
     * @param obj 发送的数据包 , 不一定是 Object,视你发送的消息类型而定,如果发送的数据包为 null,这儿可以不要这个参数
     * @param sendState 发送状态
     */
   @MHanderSendTag("outsideTag")
    void sendOutside(Object obj, int sendState){
        //MHanderSendListener.ACTIVE 发送中
        //MHanderSendListener.SUCCESS 发送成功
        //MHanderSendListener.FAIL 发送失败
    }

    /**
     * 注解方式绑定订阅者
     * 接受 socket 消息监听 收到的数据包 , 不一定是 Object,视你收到的消息类型而定,如果收到的数据包为 null,这儿可以不要这个参数
     * @param obj
     */
    @MHanderReceiveTag("outsideTag")
    void receiveOutside(Object obj){

    }

socket 自定义拦截器

/**
     * socket 拦截器
     * 可以在这里做数据拆装、重连机制
     */
    public class MySocketInterceptor implements SocketInterceptor {

        /**
         * 这里会收到服务器发来的且已处理成 String 字符串,你可以根据自己的需求进行包装
         * ReceiveMsg 有 tag 和 obj 可供你的订阅者使用
         * @param msg 收到的数据包
         * @return
         */
        @Override
        public List<ReceiveMsg> receiveServerMsg(String msg) {
            return null;
        }

        /**
         * 这里用于包装心跳包,你可以根据自己的需求包装成需要的字符串样式
         * @return
         */
        @Override
        public String heartbeat() {
            return null;
        }
        /**
         * socket 的连接状态监听
         * @param connetState  CONNECTING:连接中 INTERRUPT:已断开 SUCCESS:连接成功 CANCEL:已取消(主动调用 MessageCenter.disConnectSocket()会调用)
         * @param exception 如已断开会返回错误信息
         */
        @Override
        public void connectState(ConnetState connetState, Exception exception) {

        }
    }

混淆方式

-keepclassmembers class **{
    @com.fanjun.messagecenter.annotion.MHanderReceiveTag <methods>;
    @com.fanjun.messagecenter.annotion.MHanderSendTag <methods>;
}
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.* { *;}
-dontwarn com.google.gson.**
-keepclassmembers class * {
   public <init> (org.json.JSONObject);
}
-keepattributes Signature,InnerClasses
-keepclasseswithmembers class io.netty.** {*;}
-keepnames class io.netty.** {*;}

依赖

Maven

<dependency>
  <groupId>com.fanjun</groupId>
  <artifactId>messagecenter</artifactId>
  <version>1.0.11</version>
  <type>pom</type>
</dependency>

Gradle

 implementation 'com.fanjun:messagecenter:1.0.11'

联系我

我的博客:https://blog.csdn.net/qwe112113215
我的邮箱:810343451@qq.com
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea