EventBus可以實(shí)現(xiàn)組件間通信,線程通信,比較方便靈活,2.x和3.0差別很多乙嘀。
Android Studio 使用方式:compile'org.greenrobot:eventbus:3.0.0'
Eclipse:下載jar包導(dǎo)入
使用步驟大體分為四部:
1苦蒿、在oncreate注冊(cè)eventbus,在destroy反注冊(cè)掉
? ? ? ? ? publicvoidonCreate(Bundle?savedInstanceState)?{
? ? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? EventBus.getDefault().register(this); ? ? ? ? ? ? ? ? ? ? ??//綁定事件
}
@Override
? ? ? ? ? protectedvoidonDestroy()?{
? ? ? ? ? ? ? ? ? ?super.onDestroy();
? ? ? ? ? ? ? ? ? EventBus.getDefault().unregister(this) ; ? ? ? ? ? ?//注銷事件接受
}
2荚坞、創(chuàng)建事件類 例如? class TestEvent{
? ? ? ? ? string Message;
public TestEvent(String Message){
? ? ? ? ? ? ? this.Message= Message;
}
3、在注冊(cè)界面寫出訂閱者方法:
在EventBus2.x中 事件的訂閱者有四個(gè)方法:
? ? ? ? 1菲盾、onEvent():事件是主線程發(fā)出來的就運(yùn)行在主線程颓影,子線程發(fā)出來就運(yùn)行在子線程
? ? ? ? 2、onEventMainThread():不論事件在哪個(gè)線程發(fā)出懒鉴,都會(huì)在主線程運(yùn)行诡挂;(經(jīng)常用它和 UI打交道)
? ? ? ? ?3、onEventBackground():這個(gè)函數(shù)作為訂閱者,如果事件是UI線程發(fā)出來的璃俗,就新建子 ? 線程奴璃,在子線程中運(yùn)行;如果是子線程發(fā)出的事件旧找,就在這個(gè) 子線程中繼續(xù)運(yùn)行溺健。
? ? ? ? 4、onEventAsync():這個(gè)函數(shù)作為訂閱者钮蛛,不管在哪個(gè)線程發(fā)布鞭缭,都會(huì)創(chuàng)建新的子線程在執(zhí)行onEventAsync.
4、上面這些都完成后就可以在任何地方 向你注冊(cè)和監(jiān)聽事件的地方發(fā)送事件了
EventBus.getDefault().post(newTestEvent("EveryBody 魏颓,Come On"));
EventBus ?3.0與2.x的差別:
在EventBus3.0中岭辣,不用再寫以上四個(gè)訂閱者方法: 可以自己隨意的命名你的方法名,但是要在方法上面加上注解:@Subscribe ?例如:
//3.0的是在注解里面加運(yùn)行在哪個(gè)線程并且可以加優(yōu)先級(jí)默認(rèn)為0(優(yōu)先級(jí)越高先執(zhí)行),可以加粘性事件甸饱,函數(shù)名字不再受到權(quán)限沦童,而且可以在一個(gè)函數(shù)中體現(xiàn)出在哪個(gè)線程執(zhí)行,并且可指定接收事件的優(yōu)先級(jí)
@Subscribe(threadMode = ThreadMode.MAIN,priority = 55)
public void ?haha(TestEvent event){
Log.d(TAG,event.Message;)
}
EventBus processor使用:
EventBus提供了一個(gè)EventBusAnnotationProcessor注解處理器來在編譯期通過讀取@Subscribe()注解并解析,
處理其中所包含的信息,然后生成java類來保存所有訂閱者關(guān)于訂閱的信息,這樣就比在運(yùn)行時(shí)使用反射來獲得這些訂閱者的信息速度要快.
具體使用:在build.gradle中添加如下配置
apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'(如何配置索引可在網(wǎng)上搜索叹话,案例很多)
enentbus使用很簡單偷遗,而且很靈活,使用方式往簡單來說只有幾個(gè)步驟:
1驼壶,EventBus.getDefault().register(this); ?//注冊(cè)氏豌,綁定事件
2,創(chuàng)建實(shí)體類
3热凹,通過注解方式在注冊(cè)頁面寫一個(gè)訂閱者方法
例如;@Subscribe(threadMode = ThreadMode.MAIN,priority = 55)
public void hehe(事件類){?
? }
4,在你要發(fā)送消息的地方發(fā)送出去:
EventBus.getDefault().post(newTestEvent("EveryBody 泵喘,Come On"));
下面附上Demo代碼,并解釋粘性事件
效果圖 :沒點(diǎn)擊 發(fā)送消息之前
B界面?
C界面
點(diǎn)擊給B和C發(fā)送消息之后:主界面
B界面
C界面
Demo代碼:布局文件和控件初始化就不上傳了
MainActivity代碼:
public voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
public voidonClick(View view) {
switch(view.getId()){
caseR.id.btn_A:// 向B 和 C 發(fā)送消息
EventBus.getDefault().postSticky(newTestEvent("HI! 我過來了")); //這里使用的是postSticky般妙,發(fā)送粘性事件
break;
caseR.id.btn_ToB:// 跳轉(zhuǎn)到B
intent=newIntent(MainActivity.this,SecondActivivy.class);
startActivity(intent);
break;
caseR.id.btn_ToC://跳轉(zhuǎn)到C
intent=newIntent(MainActivity.this,ThirdActvity.class);
startActivity(intent);
break;
}
}
@Subscribe(threadMode= ThreadMode.MAIN)
public voidA(TestEvent event){
tv_A.setText(event.msg);
}
}
SecondActivity代碼;
public classSecondActivivyextendsAppCompatActivity {
privateTextViewtv_B;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activivy);
tv_B= (TextView) findViewById(R.id.tv_B);
EventBus.getDefault().register(this);
}
@Subscribe(threadMode= ThreadMode.MAIN,sticky=true) ? ? //這里sticky 設(shè)置為true
public voidB(TestEvent event){
tv_B.setText(event.msg);
}
}
ThirdActivity代碼:
public classThirdActvityextendsActivity {
privateTextViewtv_C;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.third_activity);
tv_C= (TextView) findViewById(R.id.tv_C);
EventBus.getDefault().register(this);
}
@Subscribe(threadMode= ThreadMode.MAIN,sticky=true) ? ? //sticky設(shè)置為true
public voidC(TestEvent event){
tv_C.setText(event.msg);
}
}
TestEvent代碼:
public classTestEvent {
Stringmsg;
publicTestEvent(String Msg){
this.msg= Msg;
}
}