天天看點

Otto架構的使用

轉: 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

著作權歸作者所有,轉載請聯系作者獲得授權,并标注“簡書作者”。