1.簡(jiǎn)介
EventBus能夠簡(jiǎn)化各組件間的通信检柬,讓我們的代碼書寫變得簡(jiǎn)單何址,能有效的分離事 件發(fā)送方和接收方(也就是解耦的意思)用爪, 能避免復(fù)雜和容易出錯(cuò)的依賴性和生命周期問題偎血。
2.基本使用
1.添加依賴
implementation 'org.greenrobot:eventbus:3.1.1'
2.注冊(cè)事件
在oncreate中注冊(cè) 在onDestory中解除注冊(cè)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main)颇玷;
EventBus.getDefault().register(this)亚隙;
}
3.發(fā)送事件
Ⅰ.發(fā)送普通事件
EventBus.getDefault().post("");
Ⅱ.發(fā)送粘性事件
EventBus.getDefault().postSticky(" ");
4.接受事件
Ⅰ普通事件接受
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(發(fā)送數(shù)據(jù)類型 變量名) {
}
Ⅰ粘性事件接受
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void receiveSoundRecongnizedmsg(String insType) {
if ("RECOGNIZE_SONG".equals(insType)) {
soundRecognizeCtrl();
}
}
5.解決注冊(cè)
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
注意事項(xiàng)(我的bug)
**findViewById和EventBus一起用時(shí)不注意就會(huì)報(bào)空指針異常,因?yàn)槭褂肍indViewById會(huì)自動(dòng)生成initView()方法诊霹,代碼只執(zhí)行initView()方法脾还,不接受事件就會(huì)導(dǎo)致 空指針異常
所以將找到的控件寫到setContentView()下面 刪除initView()即可 最好是使用ButterKnife
**
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast);
initView();
EventBus.getDefault().register(this);
}
@Subscribe(sticky = true)
public void receiveList(List<DatasBean> list) {
Log.i("tag", "receiveList: " + list.size());
}
private void initView() {
vp = (ViewPager) findViewById(R.id.vp);
BroadcastAdapter broadcastAdapter = new BroadcastAdapter(getSupportFragmentManager(),
mFragments);
vp.setAdapter(broadcastAdapter);
}