大概的意思就是:EventBus能夠簡化各組件間的通信,讓我們的代碼書寫變得簡單桦山,能有效的分離事件發(fā)送方和接收方(也就是解耦的意思),能避免復(fù)雜和容易出錯的依賴性和生命周期問題醋旦。
四種線程模型
EventBus3.0有四種線程模型分別是:
1.POSTING (默認(rèn)) 表示事件處理函數(shù)的線程跟發(fā)布事件的線程在同一個線程恒水。
2.MAIN 表示事件處理函數(shù)的線程在主線程(UI)線程,因此在這里不能進行耗時操作饲齐。
3.BACKGROUND 表示事件處理函數(shù)的線程在后臺線程钉凌,因此不能進行UI操作。如果發(fā)布事件的線程是主線程(UI線程)箩张,那么事件處理函數(shù)將會開啟一個后臺線程甩骏,如果果發(fā)布事件的線程是在后臺線程窗市,那么事件處理函數(shù)就使用該線程。
4.ASYNC 表示無論事件發(fā)布的線程是哪一個饮笛,事件處理函數(shù)始終會新建一個子線程運行咨察,同樣不能進行UI操作。
普通事件:注冊 → 發(fā)送 → 接收 → 取消注冊
黏性事件:發(fā)送事件 → 注冊→ 注冊后立馬接收消息 → 取消注冊(一般發(fā)送在第一個頁面福青,注冊以后是在跳轉(zhuǎn)的第二個頁面)
===========普通事件步驟和注意事項:==============================
① 添加依賴
implementation 'org.greenrobot:eventbus:3.1.1'
②自定義一個事件類(就相當(dāng)于一個Bean類)
public class MessageEvent {
public String message;
}
③注冊事件和取消注冊
當(dāng)我們需要在Activity或者Fragment里訂閱事件時摄狱,我們需要注冊EventBus。
一般選擇在Activity的onCreate()方法里去注冊EventBus无午,在onDestory()方法里媒役,去解除注冊。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main)宪迟;
//注冊eventbus
EventBus.getDefault().register(this)酣衷;
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消注冊
EventBus.getDefault().unregister(this);
}
④發(fā)送事件(普通事件) 發(fā)送方法 post
MessageEvent messageEvent = new MessageEvent();
messageEvent.message = "哈哈哈哈哈哈哈哈哈哈哈";
EventBus.getDefault().post(messageEvent);
⑤展示到UI的話 一定加注解@Subscribe
@Subscribe
public void handlerEvent(MessageEvent messageEvent) { //messageEvent 相當(dāng)于Bean類
//展示到UI
tv.setText(messageEvent.message);
}
===========黏性事件步驟和注意事項:==============================
①依賴
implementation 'org.greenrobot:eventbus:3.1.1'
②自定義一個事件類(就相當(dāng)于一個Bean類)
public class StickyEvent {
public String msg;
}
③發(fā)送黏性事件 注意發(fā)送方法 postSticky
先在第一個Activity中發(fā)送 例如在按鈕監(jiān)聽中點擊發(fā)送
//發(fā)送黏性事件
StickyEvent stickyEvent = new StickyEvent();
stickyEvent.msg = "666666";
EventBus.getDefault().postSticky(stickyEvent);
//跳轉(zhuǎn)頁面
Intent intent = new Intent(this, TwoActivity.class);
startActivity(intent);
④ 事件的注冊 和 粘性事件的接收 (一注冊就立馬接收)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
initView();
EventBus.getDefault().register(this); //必須在initView();初始化方法后面注冊
}
private void initView() {
tvv = (TextView) findViewById(R.id.tvv);
}
//接收黏性事件 展示到UI 一定注意注解@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true) //sticky =true 可以接收粘性事件
public void getS(StickyEvent stickyEvent){ //stickyEvent 相當(dāng)于Bean類
tvv.setText(stickyEvent.msg);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
⑤取消注冊
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}