簡介:
EventBus是基于觀察者/訂閱者模型

1.訂閱者訂閱自己希望的事件類型,釋出者将事件發送到EventBus後,由EventBus決定将事件交給哪個訂閱者處理
2.使用EventBus,EventBus最常用的幾個方法原型:
* EventBus.getDefault().register(Object subscriber);
* EventBus.getDefault().unregister(Object subscriber);
* EventBus.getDefault().post(Object event);
第一個為訂閱者訂閱事件,一旦在類中調用這個方法,EventBus就會周遊類中的方法,将聲明為處理事件的方法存起來,等到有訂閱者訂閱的事件時,就會調用相應的方法處理
第二個為取消注冊訂閱事件
第三個為發送一個事件到EventBus
注:本文例子中EventBus均為3.X
簡單例子
需求為點選第二個頁面的按鈕,改變第一個頁面的文本顯示
首先需要定義事件類型,其實也是一個類:
package com.example.eventbussimple;
/**
* Created by user on 2016/8/4 004.
*/
public class EventBean {
public EventBean(String name) {
this.name = name;
}
public String name;
}
第一頁代碼如下:
package com.example.eventbussimple;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);//訂閱事件
textView = (TextView) findViewById(R.id.id_text1);
findViewById(R.id.id_button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);//取消訂閱事件
}
//處理事件方法,在3.0以後都需要使用注解來表明這個 方法可以處理EventBus事件
//threadMode會在下面解釋
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleMessage(EventBean event) {
textView.setText(event.name);
}
}
第二頁代碼為
package com.example.eventbussimple;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import org.greenrobot.eventbus.EventBus;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Button button = (Button) findViewById(R.id.id_button);
if (button != null) {
//點選按鈕發送事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new EventBean("xiaowj"));
}
});
}
}
}
至此,點選第二頁按鈕,第一頁的文本就能變為xiaowj
EventBus的ThreadMode
細心的小夥伴在上面的例子中應該注意到了threadMode這個東西,簡單來說就是指明處理事件的方法要在哪種線程中執行
ThreadMode有四種枚舉類型,下面會一一解釋
- ThreadMode.POSTING 事件處理函數在事件發送線程中執行。需要盡快處理事件,這種方式是同步調用處理函數,如果長時間處理事件會導緻阻塞事件發送線程運作
- ThreadMode.MAIN 事件處理函數在主線程中執行(UI線程)。這個不用說,事件處理函數需要盡快處理事件,不然會導緻程式無響應
- ThreadMode.BACKGROUND 如果發送事件線程是主線程,就新開線程處理這個事件,如果發送事件線程不是主線程,就在發送事件的線程中執行事件處理函數。這個模式也是需要盡快處理事件,如果發送事件線程不是主線程,會同步調用事件處理函數,如果沒有快速處理事件, 同樣會導緻事件發送線程阻塞
-
ThreadMode.ASYNC 新開線程處理事件,如果事件需要長時間處理,建議選用這種模式開發
各位小夥伴可以根據上面描述選擇合适的ThreadMode處理事件
題外話,下周會更新EventBus源碼分析