Otto 一個事件總線冕碟,可以替代Intent滚粟、Handler和BroadcastReceiver 在四大組件之間傳遞消息,而且開銷極小衙耕,同時能讓我們的代碼更加優(yōu)雅昧穿,還有一個大大的好處就是可以將消息發(fā)送者和接收者解耦 。
基本用法
1. 根據(jù)實際需求定義事件
/**
* Created by dell on 2016/9/12.
*
* 定義事件
*
* 所有能被實例化為 Object 的實例都可以作為事件
* eventbus 3中如果用到了索引加速橙喘,事件類的修飾符必須為 public
*/
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2. 創(chuàng)建bus單利
創(chuàng)建一個類时鸵,在整個應(yīng)用程序范圍內(nèi)持有一個總線對象。(使用EventBus不需要這一步厅瞎,因為EventBus已近替我們實現(xiàn)好了默認的單例對象)
/**
* Created by dell on 2016/9/12.
*/
public class BusProvider {
/**
*
* 它代表一條總線饰潜,實際使用中最好作為一個單例依賴。
* 默認值在主線程執(zhí)行
*/
private static Bus buss = new Bus();
public static Bus getBuss(){
return buss;
}
private BusProvider(){
}
}
3. 注冊
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
/**
* 注冊目標組件和簸,讓總線得到這個目標中的發(fā)布者和訂閱者
*/
BusProvider.getBuss().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
BusProvider.getBuss().unregister(this);
}
4.訂閱
/**
*
* 訂閱一個事件只需要定義一個方法彭雾,標記@Subscribe注解
* 這個方法就是一個訂閱者,該方法只能有一個參數(shù)锁保,參數(shù)類型即為訂閱的事件類型
* @Subscribe 注解告訴Bus 這個函數(shù)訂閱了一個事件 薯酝,事件的類型是函數(shù)的參數(shù)
* @param event
*/
@com.squareup.otto.Subscribe
public void handleOtto(MessageEvent event) {
tvOtto.setText(event.getMessage());
}
5. 事件發(fā)布 ,有兩種方式
5.1 一種是不使用@Produce標注 爽柒,直接調(diào)用bus的post方法 吴菠。這種方式被otto官方文檔稱為PUBLISHING 。
@OnClick(R.id.btn_otto)
public void onOttoClick() {
MessageEvent event = new MessageEvent("Otto 返回來的消息");
/**
* 任何一個類的實現(xiàn)都可以作為 事件發(fā)送到總線上
* 調(diào)用POST方法 發(fā)布一個事件
*/
BusProvider.getBuss().post(event);
finish();
}
5.2 另一種是使用@Produce標注浩村,這種方式被otto官方文檔稱為PRODUCING做葵。
/**
*
* 按照這種方式顯示定義了生產(chǎn)者之后,之前在此bus上注冊過的所有該類型事件的訂閱者都會接收到本事件的實例心墅。
* 之后再再此bus上注冊的此類型的新的訂閱者同樣能夠接收到本事件實例蜂挪。
* @Produce 注解告訴bus
* 這是一個事件產(chǎn)生者重挑,產(chǎn)生的事件類型是函數(shù)的返回值
* @Produce 也是用于方法,并且這個方法的參數(shù)必須為空棠涮,返回值是你要訂閱的事件的類型
* @return
*/
@Produce
public MessageEvent postEvent(){
return new MessageEvent("Otto Produce 返回來的消息");
}
參考文檔
1谬哀、Otto源碼簡析
2、Otto學(xué)習(xí)筆記
3严肪、Otto源碼分析
4史煎、大頭鬼 Bruce Otto源碼分析