3Steps簡(jiǎn)單使用EventBus3.0
在使用EventBus 先在Gradle 添加依賴
compile 'org.greenrobot:eventbus:3.0.0'
- 定義Event事件乡革,沒(méi)有特別要求就是用來(lái)發(fā)送,傳遞亚情,與接收的事件妄痪,可以是String或者是java object。例如:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
- 訂閱事件
使用@Subscribe注解型來(lái)定義一個(gè)訂閱事件的方法楞件,并且指明線程模式衫生。例如:
//當(dāng)一個(gè)MessageEvent 被post的時(shí)候,此方法會(huì)被回調(diào)土浸,并且執(zhí)行在UI線程
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
//當(dāng)SomeOtherEvent被post的時(shí)候罪针,此方法會(huì)被回調(diào)
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
doSomethingWith(event);
}
訂閱者需要接收事件,還必須注冊(cè)與反注冊(cè)在Activity或者在Fragment的生命周期上黄伊。
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
- 發(fā)布事件
可以在任何你想的代碼上寫(xiě)發(fā)布事件泪酱,然后注冊(cè)了的地方將會(huì)接收到。例如:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
傳遞線程ThreadMode
EventBus 可以為你處理訂閱事件所在的線程还最,在上面講到的一個(gè)訂閱事件的處理上定義了在ThreadMode.Main即主線程墓阀,ThreadMode一共有四種模式,分別是POSTING拓轻、MAIN岂津、BACKGROUND與ASYNC。
- ThreadMode: POSTING
這種模式是與發(fā)布所在的線程同在一個(gè)線程悦即,這個(gè)模式回調(diào)是最快的吮成。
@Subscribe(threadMode = ThreadMode.POSTING)
// ThreadMode is optional here
public void onMessage(MessageEvent event) {
log(event.message);
}
- ThreadMode: MAIN
回調(diào)將在主線程中回調(diào),也稱UI線程辜梳,如果發(fā)布事件的是在在主線程粱甫,那么此模式為T(mén)hreadMode: POSTING,可以快速回調(diào)作瞄。
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
```
* ThreadMode: BACKGROUND
將在后臺(tái)線程調(diào)用茶宵。如果發(fā)布線程不是主線程,事件處理方法將直接在發(fā)布線程調(diào)用宗挥。如果發(fā)布線程是主線程乌庶,EventBus使用單個(gè)后臺(tái)線程調(diào)用种蝶。
```java
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
```
* ThreadMode:ASYNC
事件處理方法被稱為在一個(gè)單獨(dú)的線程。這始終是獨(dú)立于發(fā)布線程和主線程,EventBus使用一個(gè)線程池來(lái)有效地重用完成的異步事件處理程序的通知線程瞒大。
```java
// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
```
####下一篇[EventBus3.0使用(二)](http://www.reibang.com/p/3a7b6c2b4987)