轉: Otto架構的使用
otto 架構就是事件分發總線.
otto 下載下傳位址:http://square.github.io/otto/
1.0 為什麼要使用事件分發總線?
事件分發總線可以降低多個類之間的耦合度的。
在 android 中 Fragment 對 Activity 的通信方式的 Interface 的方式,Activity 和 Activity 的值的回調是用 startActivityForResult()的方法.Fragment 和 Fragment中的通信是用 Interface 的方式...
現在有一個新的方式:使用事件分發總線.它可以替代這些操作,并且寫法更加的簡單.
2.0為什麼要使用 otto 架構?與Eventbus 比較呢?
Eventbus是一個非常強大的一個架構,它采用的使用特定的方法名的方式接受消息.
就功能來講, eventbus 也勝一籌,因為它定義了很多個操作類型,包括異步線程,主線程調用等.
之是以選擇 otto, 而不使用 eventBus, 因為otto 使用注解的形式,注解更能被程式員識别.并且避免了因為拼寫不正确導緻的事件不起作用.
3.0.什麼時候使用otto
在處理Fragment 和 Fragment的通信,Activity 和Fragment 的通信, Activity 和 Activity的通信...
在比較複雜的場景:
1.由界面 A 跳轉到界面 B 再跳轉到 界面C, 然後點選 C中的 button, 現在要更新 界面 A 和界面 B 的視圖
2.界面有一個 界面 A,A 裡面的有個 Fragment, 點選 Fragment 中的一個 button,跳轉到界面 B, 點選界面 B的 button 要更新界面 A 的 Fragment 的視圖.
可以看出上面舉例的兩種如果用startActivityForResult 和 interface 的方式實作的話,會比較麻煩,并且産生了很多的狀态判斷和邏輯判斷,并且可能産生很多不必要的 bug, 使代碼量變大,使用 otto 就可以能容易的避免這些.
4.0 主要方法
主要的方法有3個,夠少吧.
register(Object o):注冊,注冊以後可以訂閱事件
unregister(Object o)登出.放棄對之前的訂閱的所有事件
post(Object o)釋出事件,會被有Subscribe注解的方法擷取到
注解:
@Subscribe:這個在調用了register後有效,表示訂閱了一個事件,并且方法的用 public 修飾的.方法名可以随意取,重點是參數,它是根據你的參數進行判斷
@Produce注解告訴Bus該函數是一個事件産生者,産生的事件類型為該函數的傳回值。
5.0 otto 架構使用例子
現在我們的任務是界面 A 跳轉到界面 B, 點選 B 的 button 更新 A 的視圖.
首先我們要自行實作單例模式.
使用以下BusProvider.class類實作單例
/**
* Maintains a singleton instance for obtaining the bus. Ideally this would be replaced with a more efficient means
* such as through injection directly into interested classes.
*/
public final class BusProvider {
private static final Bus BUS = new Bus();
public static Bus getInstance() {
return BUS;
}
private BusProvider() {
// No instances.
}
}
定義一個 class ,用于界面 B 要傳遞會界面 A 的參數
/**
* Created by zzz40500 on 15/1/14.
*/
public class TestAction {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
A.class
public class A extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BusProvider.getInstance().register(this);
}
//這個注解一定要有,表示訂閱了TestAction,并且方法的用 public 修飾的.方法名可以随意取,重點是參數,它是根據你的參數進行判斷
@Subscribe
public void testAction(TestAction testAction){
//這裡更新視圖或者背景操作,從TestAction擷取傳遞參數.
}
@Override
public void onDestroy() {
BusProvider.getInstance().unregister(this);
super.onDestroy();
}
}
在界面 B
public class B extends ActionBarActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TestAction testAction=new TestAction();
testAction.setStr("click");
BusProvider.getInstance().post(testAction);
}
});
}
}
總結:
otto 是一個非常優秀和強大的架構.
在它的使用過程發現:其實你在釋出事件的時候并不需要register這個類,而且也可以不使用Produce這個注解,你隻要調用這個 BusProvider.getInstance().post(object)方法就可以了,他就會分發事件,這樣是不是會更友善呢.
但是你要Subscribe訂閱事件就一定要register這個類了,否則是接受不到事件的.
otto 傳遞事件的時候,參數最後用一個實體類包裹着.因為有些參數不能直接傳遞.
文/輕微(簡書作者)
原文連結:http://www.jianshu.com/p/c8ff4a999a28
著作權歸作者所有,轉載請聯系作者獲得授權,并标注“簡書作者”。