v1.3.3 release note
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的原因,所以希望对该功能比较感兴趣的朋友们多阅读源码。