第11天EventBus和Otto第三方架構
EventBus
一.EventBus介紹:
二.EventBus三大要素
三.EventBus四種線程模型
四.代碼案例:
Otto第三方架構
EventBus
一.EventBus介紹:
EventBus能夠簡化各元件間的通信,讓我們的代碼書寫變得簡單,能有效的分離事件發送方和接收方(也就是解耦的意思)。
二.EventBus三大要素
Event 事件。它可以是任意類型。
Subscriber 事件訂閱者。
Publisher 事件的釋出者。我們可以在任意線程裡釋出事件,一般情況下,使用EventBus.getDefault()就可以得到一個EventBus對象,然後再調用post(Object)方法即可。
三.EventBus四種線程模型
POSTING (預設) 表示事件處理函數的線程跟釋出事件的線程在同一個線程。
MAIN 表示事件處理函數的線程在主線程(UI)線程,是以在這裡不能進行耗時操作。
BACKGROUND 表示事件處理函數的線程在背景線程,是以不能進行UI操作。如果釋出事件的線程是主線程(UI線程),那麼事件處理函數将會開啟一個背景線程,如果果釋出事件的線程是在背景線程,那麼事件處理函數就使用該線程。
ASYNC 表示無論事件釋出的線程是哪一個,事件處理函數始終會建立一個子線程運作,同樣不能進行UI操作。
四.代碼案例:
1, 添加依賴 compile ‘org.greenrobot:eventbus:3.1.1’
2, 注冊EventBus — onCreate() 方法中
3, 取消注冊EventBus – onDestry() 方法中
4, 明确指定訂閱者, 通過參數來傳遞消息, 同時可以指定方法在主線程中執行
5, post釋出消息
1.添加依賴:
implementation ‘org.greenrobot:eventbus:3.0.0’
1
2.定義消息事件類
public class MessageEvent{
private String message;
public MessageEvent(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3.注冊和解除注冊+聲明訂閱者+事件釋出
分别在Activity的onCreate()方法和onDestory()方法裡,進行注冊EventBus和解除注冊。
注意:訂閱者的方法必須被public修飾
public class FirstActivity extends AppCompatActivity {
private Button mButton;
private TextView mText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_activity);
mButton = (Button) findViewById(R.id.btn1);
mText = (TextView) findViewById(R.id.tv1);
//注冊
EventBus.getDefault().register(this);
//釋出事件
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent("歡迎大家浏覽我寫的部落格"));
}
});
}
//聲明訂閱者
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(MessageEvent messageEvent) {
mText.setText(messageEvent.getMessage());
}
//解除注冊
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
Otto第三方架構
注意:訂閱者的方法必須被public修飾
1, 導入依賴 implementation ‘com.squareup:otto:1.3.8’
2, 定義一個類 AppBus, 繼承Bus , ---- 單例模式 , 傳回Bus 的子類對象
3, 注冊到Bus 的主線程中
AppBus.getInstance().register(this);
4, 在onDestry() 方法中取消注冊
@Override
protected void onDestroy() {
super.onDestroy();
AppBus.getInstance().unregister(this);
}
5, 聲明訂閱者
@Subscribe
public void receiveMessage(String result)
{
Toast.makeText(this, "result = " + result, Toast.LENGTH_SHORT).show();
}
6, 發起訂閱 – 主線程中