事件分发库-EventBus
2018-09-06 本文已影响0人
飞奔吧牛牛
准备
下载jar包
eventbus-3.1.1.jar
混淆
http://greenrobot.org/eventbus/documentation/proguard/
#EventBus
-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);
}
#EventBus
使用
在接收消息的Activity或fragment中注册
//activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
//fragment
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
在两个Button点击事件中发送消息
//在主线程中发送消息
public void onClick(View v) {
EventBus.getDefault().post(new MyEvent("this is a event"));
}
//在子线程中发送消息
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
EventBus.getDefault().post(new MyEvent("this is a event2"));
}
}).start();
}
接收消息,打印使用的线程模式,接收消息的线程id,接收的消息内容
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventPOSTING(MyEvent event) {
Log.e(TAG, "POSTING: " + Thread.currentThread().getId() + " " + event.getMsg());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMain(MyEvent event) {
Log.e(TAG, "MAIN: " + Thread.currentThread().getId() + " " + event.getMsg());
}
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onEventMAIN_ORDERED(MyEvent event) {
Log.e(TAG, "MAIN_ORDERED: " + Thread.currentThread().getId() + " " + event.getMsg());
}
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventASYNC(MyEvent event) {
Log.e(TAG, "ASYNC: " + Thread.currentThread().getId() + " " + event.getMsg());
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventBACKGROUND(MyEvent event) {
Log.e(TAG, "BACKGROUND: " + Thread.currentThread().getId() + " " + event.getMsg());
}
输出结果
在主线程中发送消息时:
test: ASYNC: 5987 this is a event
test: MAIN: 1 this is a event
test: POSTING: 1 this is a event
test: BACKGROUND: 5988 this is a event
test: MAIN_ORDERED: 1 this is a event
在子线程中发送消息时:
test: BACKGROUND: 5989 this is a event2
test: POSTING: 5989 this is a event2
test: ASYNC: 5990 this is a event2
test: MAIN_ORDERED: 1 this is a event2
test: MAIN: 1 this is a event2
总结:
接收代码所在线程和发送代码所在线程的关系
POSTING:和发送方保持一直
MAIN:不管发送方在哪里,始终在Main线程
ASYNC:不管发送方在哪里,始终开启新线程
BACKGROUND:如果发送方在主线程,BACKGROUND则会新开一个线程;如果发送方在子线程,BACKGROUND则会和发送方保持一致
MAIN_ORDERED:和MAIN一样,但事件会按先后顺序执行。
更新StickyEvent
如果Event发送过了,但是后面的Activity仍然想接收,由于后面的Activity的注册行为发生在事件发出之后,所以它是收不到事件的。解决方法就是使用postSticky。
//事件发出
EventBus.getDefault().postSticky(new MyEvent("this is a event"));
//事件接收
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void testSicky(MyEvent event) {
Log.e("test2", Thread.currentThread().getId() + " " + event.getMsg());
}
//事件移除
public void removeEvent() {
MyEvent stickyEvent = EventBus.getDefault().getStickyEvent(MyEvent.class);
if (stickyEvent != null) {
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
}