介绍
Android项目中的组件间通信,解耦、简洁、高效。
示意图github地址:https://github.com/greenrobot/EventBus
官方文档:http://greenrobot.org/eventbus/documentation
使用
1、引入
compile 'org.greenrobot:eventbus:3.1.1'
2、定义一个消息实体
使用单例避免重复创建
public class MessageEntity {
/**
* 标识
*/
public int mWhat;
/**
* 数据
*/
public Object mMsg;
private MessageEntity() {
}
private static class Holder {
private static final MessageEntity INSTANCE = new MessageEntity();
}
public static MessageEntity obtainMessage() {
return Holder.INSTANCE;
}
}
3、定义一个常量类
用来标识消息类别msg.what
public final class MsgConstants {
/**
* 从SecActivity 传递数据到MainActivity
*/
public static int SHOW_INPUT_CONTENT = 1;
}
4、数据的传递
- 订阅事件
////订阅事件
EventBus.getDefault().register(this);
...
@Override
protected void onDestroy() {
super.onDestroy();
//取消//订阅事件
EventBus.getDefault().unregister(this);
}
...
//订阅事件的处理, 在ui线程执行 , 优先级100
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
public void receiveMsg(MessageEntity msg) {
if (msg.mWhat == MsgConstants.SHOW_INPUT_CONTENT) {
String content = ((String) msg.mMsg);
if (content != null && !content.isEmpty()) {
mContentTv.setText("从SecActivity传递过来的数据是:" + content);
Log.e(TAG, "从SecActivity传递过来的数据是:" + content);
} else {
Log.e(TAG, " content is null or empty ");
}
}
}
注意,优先级高的订阅者可以终止事件往下传递
EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
- 发布事件
MessageEntity msg = MessageEntity.obtainMessage();
msg.mWhat = MsgConstants.SHOW_INPUT_CONTENT;
msg.mMsg = content;
EventBus.getDefault().post(msg);
5、EventBus四种线程交互模式(四种 ThreadMode
):
NAIN ---- UI主线程
指定接收方法在主线程中执行,可以放心的在里面执行更新UI操作。无论发布者是在主线程中还是在那一条子线程中发布消息,这边接收的都在主线程中
BACKGROUND ---- 子线程
无论发布者是在主线程或者是那一条子线程中发布消息,接收的肯定是在子线程中,并且是这样理解:如果是在主线程中发布消息,那么就会随机开辟一条子线程来接收消息。如果是在子线程中发布消息,那么就会在相同的子线程来接收消息。
POSTING ---- 和发布者处在同一个线程
在同一个线程中接收,也就是说,如果是在主线程中发布消息就只能在主线程中接收消息,如果是在子线程中,那么也只能在相同的子线程中去接收消息。
ASYNC ---- 异步线程
无论你在那个线程中发布消息都会在不同的线程中接受消息。如果你在主线程中发布消息,就会随机的开辟一条子线程来接收消息;如果是在子线程中发布消息,就会开辟一条不同的子线程来接收消息。
6、代码混淆
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
网友评论