前言
otto 是 Square公司發(fā)布的一個發(fā)布-訂閱模式框架镜沽,它基于Google Guava 項目中的event bus模塊開發(fā),針對Android平臺做了優(yōu)化和加強贱田。雖然Square已經(jīng)停止了對otto的更新并推薦使用RxJava和RxAndroid來替代它缅茉,但是otto的設(shè)計理念和源碼仍舊值得學(xué)習(xí),這一篇先來學(xué)習(xí)下otto的使用方法男摧。
添加依賴庫
首先配置gradle蔬墩,如下所示译打。
compile 'com.squareup:otto:1.3.8'
定義消息類
與EventBus一樣,我們接著定義消息類拇颅,它是一個bean文件奏司,如下所示。
public class BusData {
public String message;
public BusData(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
單例封裝Bus
otto的Bus類相當(dāng)與EventBus中的EventBus類樟插,它封裝了otto的主要功能韵洋,但它不是個單例,每次都要用new創(chuàng)建出來,這樣顯然不是很方便痹届,因此我們用單例模式將它封裝起來,如下所示。
public class OttoBus extends Bus{
private volatile static OttoBus bus;
private OttoBus (){
}
public static OttoBus getInstance() {
if (bus == null) {
synchronized (OttoBus.class){
if(bus==null){
bus = new OttoBus();
}
}
}
return bus;
}
}
注冊和取消注冊訂閱事件
otto同樣需要注冊和取消注冊訂閱事件充易,通過OttoBus得到Bus對象炸茧,調(diào)用Bus的register和unregister方法來注冊和取消注冊,同時我們定義一個button,點擊這個button跳轉(zhuǎn)到SecondActivity偶翅,SecondActivity用來發(fā)送事件爆价。代碼如下所示。
public class MainActivity extends AppCompatActivity {
private Button bt_jump;
private TextView tv_message;
private Bus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_message= (TextView) this.findViewById(R.id.tv_message);
bt_jump= (Button) this.findViewById(R.id.bt_jump);
bt_jump.setText("跳轉(zhuǎn)到SecondActivity");
bt_jump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
bus=OttoBus.getInstance();
bus.register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//取消注冊訂閱事件
bus.unregister(this);
}
事件訂閱者處理事件
和EventBus一樣用@Subscribe來訂閱事件芬膝,在MainActivity中添加如下代碼桐早。
@Subscribe
public void setContent(BusData data) {
tv_message.setText(data.getMessage());
}
同樣的用textView來顯示接收到的消息。
使用post發(fā)送事件
創(chuàng)建SecondActivity,并設(shè)置一個button膨俐,點擊發(fā)送事件的止,并finish掉自身,如下所示。
public class SecondActivity extends AppCompatActivity {
private Button bt_jump;
private OttoBus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_jump= (Button) this.findViewById(R.id.bt_jump);
bt_jump.setText("發(fā)送事件");
bt_jump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OttoBus.getInstance().post(new BusData("劉望舒的博客更新了"));
finish();
}
});
}
}
這樣我們運行程序點擊MainActivity的"跳轉(zhuǎn)到SecondActivity"按鈕直接跳轉(zhuǎn)到SecondActivity崩溪,再點擊"發(fā)送事件"按鈕乳幸,SecondActivity被finish掉回到MainActivity 瓶埋,MainActivity 中的textView的文字變?yōu)榱?劉望舒的博客更新了"。
使用@Produce來發(fā)布事件
Produce注解用來生產(chǎn)發(fā)布事件,需要注意的是它生產(chǎn)事件前它需要注冊尖啡,并且在生產(chǎn)完事件后需要取消注冊怠褐。如果使用這種方法則在跳轉(zhuǎn)到發(fā)布者所在的類中則會立即產(chǎn)生事件并觸發(fā)訂閱者,修改SecondActivity,代碼如下所示怠晴。
public class SecondActivity extends AppCompatActivity {
private Button bt_jump;
private OttoBus bus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_jump= (Button) this.findViewById(R.id.bt_jump);
bt_jump.setText("發(fā)送事件");
bt_jump.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
bus=OttoBus.getInstance();
bus.register(this);
}
@Produce
public BusData setInitialContent() {
return new BusData("劉望舒的博客更新了");
}
@Override
protected void onDestroy() {
super.onDestroy();
bus.unregister(this);
}
}
在MainActivity跳轉(zhuǎn)到SecondActivity時,MainActivity會馬上收到事件餐茵。