日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开源框架——事件总线otto

發布時間:2025/3/21 Android 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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類實現單例

/*** 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 {@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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。