Android事件總線(三)otto用法全解析

前言

otto 是 Square公司發佈的一個發佈-訂閱模式框架,它基於Google Guava 項目中的event bus模塊開發,針對Android平臺作了優化和增強。雖然Square已經中止了對otto的更新並推薦使用RxJava和RxAndroid來替代它,可是otto的設計理念和源碼仍舊值得學習,這一篇先來學習下otto的使用方法。git

添加依賴庫

首先配置gradle,以下所示。github

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;
    }
}
View Code

單例封裝Bus

otto的Bus類至關與EventBus中的EventBus類,它封裝了otto的主要功能,但它不是個單例,每次都要用new建立出來,這樣顯然不是很方便,所以咱們用單例模式將它封裝起來,以下所示。ide

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;
    }
}
View Code

註冊和取消註冊訂閱事件

otto一樣須要註冊和取消註冊訂閱事件,經過OttoBus獲得Bus對象,調用Bus的register和unregister方法來註冊和取消註冊,同時咱們定義一個button,點擊這個button跳轉到SecondActivity,SecondActivity用來發送事件。代碼以下所示。post

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("跳轉到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);
    }
View Code

事件訂閱者處理事件

和EventBus同樣用@Subscribe來訂閱事件,在MainActivity中添加以下代碼。學習

@Subscribe
public void setContent(BusData data) {
      tv_message.setText(data.getMessage());
}
View Code

一樣的用textView來顯示接收到的消息。gradle

使用post發送事件
建立SecondActivity,並設置一個button,點擊發送事件,並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("發送事件");
        bt_jump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                OttoBus.getInstance().post(new BusData("劉望舒的博客更新了"));
                finish();
            }
        });
    }
}
View Code

這樣咱們運行程序點擊MainActivity的」跳轉到SecondActivity」按鈕直接跳轉到SecondActivity,再點擊」發送事件」按鈕,SecondActivity被finish掉回到MainActivity ,MainActivity 中的textView的文字變爲了」劉望舒的博客更新了」。this

使用@Produce來發布事件
Produce註解用來生產發佈事件,須要注意的是它生產事件前它須要註冊,而且在生產完事件後須要取消註冊。若是使用這種方法則在跳轉到發佈者所在的類中則會當即產生事件並觸發訂閱者,修改SecondActivity,代碼以下所示spa

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("發送事件");
        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);
    }
}
View Code

在MainActivity跳轉到SecondActivity時,MainActivity會立刻收到事件。

github源碼下載

相關文章
相關標籤/搜索