用于元件間的通訊,程序間的通訊,線程間的通訊,無所不能的通訊
事件釋出訂閱總線,原理:2.x使用反射機制影響性能;3.0使用EventBusAnnotationProcessor注解處理器在編譯期通過讀取@Subscribe()注解并解析、處理其中所包含的資訊,然後生成java類來儲存所有訂閱者關于訂閱的資訊,這樣就比在運作時使用反射來獲得這些訂閱者的資訊速度要快
用法:
1建立對象
public static class MessageEvent { /* Additional fields if needed / }
2發送對象:EventBus.getDefault().post(new MessageEvent());
3接收對象:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/ Do something */};
PS能夠接收對象的前提的是已經在接收事件的類裡注冊,當然也不要忘記解注冊
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
在gradle中 添加compile就不說了
compile ‘org.greenrobot:eventbus:3.1.1’
對于的解釋:threadMode
EventBus的@Subscribe訂閱的線程有四種模式:
1Thread.PostThread預設方式,在發送這post線程中執行【常用】(發送者是主線程訂閱者就是主線程,發送者post是子線程訂閱者Subscribe就是子線程)
2ThreadMode.MainThread 在主線程(UI線程)中執行【常用】(跟發送者post無關,訂閱者subscribe都是在主線程中執行)
3ThreadMode.BackGroundThread在子線程(背景線程)中執行(如果事件在主線程釋出則new一個子線程執行,如果事件在子線程中釋出則在目前子線程中執行)
4ThreadMode.Async強制在背景執行(無論事件在哪個線程釋出,都會new一個子線程執行)
拓展:
EventBus 3.0 函數名字不再受到權限,而且可以在一個函數中展現出在哪個線程執行,并且可指定接收事件的優先級
例
/**
* 普通事件
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN, priority = 100)
public void onDataSynEvent(DataSynEvent event) {
}
/**
* 粘性事件
* @param event
*/
@Subscribe(threadMode = ThreadMode.MAIN, priority = 100, sticky = true)
public void onDataSynEvent(DataSynEvent event) {
}
上例子
EventBus.getDefault().post(mMessageEvent);
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
/* Do something */
tvServiceCommunication.setText("EventBus線程通訊獲得子線程的資料:" + event.mMessagecount + "");
}
package com.blzt.register.eventbus;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.blzt.register.R;
import com.blzt.register.aidl.MyService;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.Timer;
//EventBus實作線程間通訊
public class EventBusActivity extends Activity implements View.OnClickListener {
private TextView tvServiceCommunication;
private LinearLayout golayout;
int count = 0;
private Timer mTimer;
MessageEvent mMessageEvent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_eventbus);
tvServiceCommunication = (TextView) findViewById(R.id.tv_service_communication);
golayout = (LinearLayout) findViewById(R.id.golayout);
findViewById(R.id.bt_go1).setOnClickListener(this);
findViewById(R.id.bt_go2).setOnClickListener(this);
findViewById(R.id.bt_go3).setOnClickListener(this);
findViewById(R.id.bt_go4).setOnClickListener(this);
mMessageEvent = new MessageEvent();
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
/*
ThreadMode.MAIN--不論發送者是主線程還是子線程。我們都在主線程執行相應操作
ThreadMode.POSTING---在發送者的線程中執行
ThreadMode.BACKGROUND----如果釋出者就是子線程,那麼直接在釋出者的子線程執行,如果釋出者是主線程,則直接new一個新的子線程執行
ThreadMode.ASYNC----無論事件在哪個線程釋出,都會建立新的子線程在執行
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
/* Do something */
tvServiceCommunication.setText("EventBus線程通訊獲得子線程的資料:" + event.mMessagecount + "");
}
;
Thread mThread = null;
boolean isStop = false;
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.bt_go1:
//TODO implement
mThread = new MyThread();
mThread.start();
isStop = false;
// new MyThread().start();
break;
case R.id.bt_go2:
//TODO implement
// mThread.stop();
isStop = true;
mThread = null;
break;
case R.id.bt_go3:
//TODO implement
Log.e("wy", "start service: ");
Intent mIntent = new Intent(this, MyService.class);
startService(mIntent);
break;
case R.id.bt_go4:
//TODO implement
break;
}
}
private class MyThread extends Thread {
@Override
public void run() {
super.run();
while (!isStop) {
SystemClock.sleep(500);
count++;
mMessageEvent.mMessagecount = count;
EventBus.getDefault().post(mMessageEvent);
Log.w("wy", "run: " + count);
}
}
}
}
package com.blzt.register.eventbus;
public class MessageEvent {
public int mMessagecount;
}