Android开源框架——事件总线otto
開源官網:https://github.com/square/otto
guide:http://square.github.io/otto/
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類實現單例
定義一個 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 {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);BusProvider.getInstance().register(this);}//這個注解一定要有,表示訂閱了TestAction,并且方法的用 public 修飾的.方法名可以隨意取,重點是參數,它是根據你的參數進行判斷@Subscribepublic void testAction(TestAction testAction){//這里更新視圖或者后臺操作,從TestAction獲取傳遞參數.}@Overridepublic void onDestroy() {BusProvider.getInstance().unregister(this);super.onDestroy();} }在界面 B
public class B extends ActionBarActivity {private Button button;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);button= (Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic 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 傳遞事件的時候,參數最后用一個實體類包裹著.因為有些參數不能直接傳遞.
注意
square官方已經不推薦使用了otto,取代代之的是RxJava與RxAndroid
轉自:http://www.jianshu.com/p/c8ff4a999a28
總結
以上是生活随笔為你收集整理的Android开源框架——事件总线otto的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开源框架——图表MPAnd
- 下一篇: Android开源框架——图片加载与缓存