Skip to content

v1.3.3 release note

Compare
Choose a tag to compare
@leobert-lan leobert-lan released this 27 Aug 09:23
· 30 commits to master since this release

ADDING:
message middle ware.

这个消息中间件拖了很久,一直也没有系统的时间好好处理,可能一些bug之后也未必有时间处理

features:

  • support cross process;
  • use interface to create a manager.(means the manager can orientate to a whole module)
  • use callback (different with event bus)

guide:

step1:

(optional, necessary in cross process ) create a unique sub class of MessageService for a specific process, and notate it with MsgBridgeService. and register it in the manifest

//@MsgBridgeService(workProcessName = "com.luojilab.componentdemo.application")
// empty can represent the default process
@MsgBridgeService(workProcessName = "")
public class MainProcessMsgService extends MessageBridgeService {
    public MainProcessMsgService() {
    }

}

说明:MsgBridgeService#workProcessName的值如果未空代表是默认的进程,其他进程可以使用全进程名或者一个别名,确保全局唯一即可。

step2:

了解小细节
org.github.jimu.msg.EventManager#appendMapper 初始化进程信息。注意,使用JIMU插件会自动生成初始化的代码,不需要任何人工处理,这里仅仅是提一下。

step3:

了解如何为Module创建管理API

public interface AppComponentEventManager {
    @AriseProcess()
    @Event(clz = EventA.class)
    void subscribeEventA(@Consumer ConsumerMeta meta);

    @AriseProcess(pa = ":remote")
    @Event(clz = EventB.class)
    void subscribeEventB(@Consumer ConsumerMeta meta);
}

说明:
建议每个Module将所有的事件订阅统一到一起(或者区分Module内使用的,对外暴露的);
1、接口不可以有继承关系
2、AriseProcess 必要,pa means processAlias,对应step1中workProcessName的值,也即事件发出的进程别名
3、@event 必要,订阅的事件的类,不支持继承关系,即订阅EventB仅能收到EventB,Foo extends EventB是收不到的。
4、必须void,方法命名随意,形参有且仅有一个,必须使用@consumer注解

step4:

了解小细节:
如果跨Module订阅,必要的类需要下沉到ComponentService;

step5:

了解初始化
Application#onCreate中 调用:EventManager.init(this);

step6:

了解事件类

非跨进程的:

public class EventA implements EventBean {
}

跨进程的:将需要实现Parcelable

public class EventB implements RemoteEventBean{
    private String msg;

    public EventB(String msg) {
        this.msg = msg;
    }

    protected EventB(Parcel in) {
        msg = in.readString();
    }

    public static final Creator<EventB> CREATOR = new Creator<EventB>() {
        @Override
        public EventB createFromParcel(Parcel in) {
            return new EventB(in);
        }

        @Override
        public EventB[] newArray(int size) {
            return new EventB[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(msg);
    }

    public String getMsg() {
        return msg;
    }
}

step7:

了解小细节:可以通过Router来保持manager 的单例,减少频繁反射、动态代理所带来的损耗

 Router.getInstance().addService(AppComponentEventManager.class.getSimpleName(),
                EventManager.create(AppComponentEventManager.class));

step8:

了解订阅

  EventListener<EventA> eventAEventListener;
    EventListener<EventB> eventBEventListener;

        eventAEventListener = new EventListener<EventA>() {
            @Override
            public void onEvent(EventA event) {
                tvMsg.setText(event.getMsg());
            }
        };

        eventBEventListener = new EventListener<EventB>() {
            @Override
            public void onEvent(EventB event) {
                tvMsg.setText(event.getMsg());
            }
        };

//        EventManager.getInstance().subscribe(EventA.class, eventAEventListener);

        AppComponentEventManager manager = (AppComponentEventManager) Router.getInstance()
                .getService(AppComponentEventManager.class.getSimpleName());

        manager.subscribeEventA(ConsumerMeta.<EventA>newBuilder()
                .consumeOn(ConsumeOn.Main)
                .eventListener(eventAEventListener)
                .build());

        manager.subscribeEventB(ConsumerMeta.<EventB>newBuilder()
                .consumeOn(ConsumeOn.Main)
//                .process("") // 一般来说,都不需要特地写进程了,我们约定""就代表默认进程
                .eventListener(eventBEventListener)
                .build());

step9

了解解注册

 EventManager.getInstance().unsubscribe(eventBEventListener);
        EventManager.getInstance().unsubscribe(eventAEventListener);
      

step10

了解发布

 EventManager.getInstance().postEvent(new EventB("event b from Msg3Activity"));

其实了解实现思路之后用EventBus等成熟框架重新封装更加合适,不过eventbus本身的设计和API式管理不太协调。

另外一些细节不再赘述,因个人工作和生活原因可能不能对这个中间件提供足够的技术支持,这也是我没有将它独立出来成为一个lib的原因,所以希望对该功能比较感兴趣的朋友们多阅读源码。