关于EventBus

1
2
EventBus.getDefault().register(this)
EventBus.getDefault().unregister(this)

@Subscribe 订阅者方法
ThreadMode 决定了订阅者的行为处理在主线程还是子线程,也是就耗时操作尽量开辟子线程,避免ANR等等,一般默认就行

发布者 在主线程发送事件 在子线程发送事件
main 主线程 主线程
posting 主线程 子线程
async 新开一个子线程 新开一个子线程
background 新开一个子线程 子线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Subscribe(threadMode = ThreadMode.MAIN) 
public void MessageEventBus(EventBusMessage eventBusMessage){
//在TextView显示接收的消息,从这个类里拿属性.
tv_title.setText(eventBusMessage.Message);
Log.d("eventBusThread","ThreadMode.MAIN "+Thread.currentThread().getName());
}

//ThreadMode.POSTING表示该方法和消息发送方在同一个线程.
@Subscribe(threadMode = ThreadMode.POSTING)
public void MessageEventBus1(EventBusMessage eventBusMessage){
Log.d("eventBusThread","ThreadMode.POSTING "+Thread.currentThread().getName());
}

/*ThreadMode.ASYNC也表示在后台执行(也就是子线程执行),可以异步并发处理
(适用于多个线程任务处理,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建线程去请求)
无论发布者是在子线程还是主线程,该方法都会创建一个子线程,在子线程执行.*/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void MessageEventBus2(EventBusMessage eventBusMessage){
Log.d("eventBusThread","ThreadMode.ASYNC "+Thread.currentThread().getName());
}

//ThreadMode.BACKGROUND表示该方法在后台运行(也就是子线程),不能够并发处理
//如果发布者在子线程,那么该方法就在子线程执行
//如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行.
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void MessageEventBus3(EventBusMessage eventBusMessage){
Log.d("eventBusThread","ThreadMode.BACKGROUND "+Thread.currentThread().getName());
}