作者:某人_Valar
如需轉(zhuǎn)載請(qǐng)保留原文鏈接
EventBus的GitHub地址:https://github.com/greenrobot/EventBus
本文會(huì)把包括兩個(gè)EventBus的案例涡相,來(lái)簡(jiǎn)單實(shí)現(xiàn)EventBus的使用。
相關(guān)文章
本文結(jié)構(gòu)
- 1.EventBus的使用
- 2.粘性(sticky)EventBus的使用
兩者的區(qū)別剩蟀,普通的EventBus使用都是需要先注冊(cè)(register)催蝗,再發(fā)送消息(POST),才能接收到數(shù)據(jù)。
如果使用postSticky發(fā)送喻旷,就先接受到數(shù)據(jù)生逸,之后在進(jìn)行注冊(cè)時(shí),數(shù)據(jù)就隨之展現(xiàn)出來(lái)且预。
1.EventBus的使用
1.1 引用包
compile 'org.greenrobot:eventbus:3.0.0'
1.2 準(zhǔn)備
新建了一個(gè)EventBusActivity當(dāng)做發(fā)送數(shù)據(jù)界面槽袄,新建一個(gè)ResultActivity用于呈現(xiàn)結(jié)果,在activity_main.xml中添加一個(gè)按鈕锋谐,
<Button
android:id="@+id/bt_eventBus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點(diǎn)擊進(jìn)入EventBus測(cè)試"
/>
并在MainActivity中添加一個(gè)點(diǎn)擊事件跳轉(zhuǎn)到EventBusActivity遍尺。
Button mButton = (Button) findViewById(R.id.bt_eventBus);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,EventBusActivity.class);
startActivity(intent);
}
});
1.3 注冊(cè)與解注冊(cè)
在EventBusActivity的onCreate()方法中注冊(cè)
EventBus.getDefault().register(EventBusActivity.this);
重寫(xiě)EventBusActivity的onDestroy()方法進(jìn)行解注冊(cè)
@Override
protected void onDestroy() {
super.onDestroy();
//3.3 解注冊(cè)
EventBus.getDefault().unregister(EventBusActivity.this);
}
1.4 創(chuàng)建發(fā)送消息類
新建一個(gè)MyMessage類如下
public class MyMessage {
public String name;
public MyMessage(String name){
this.name = name;
}
}
1.5 發(fā)送消息
可自己添加一個(gè)按鈕,點(diǎn)擊即發(fā)送
mbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new MyMessage("主線程發(fā)送的數(shù)據(jù)-001"));
//發(fā)送之后跳轉(zhuǎn)到ResultActivity界面查看結(jié)果
Intent intent = new Intent(EventBusActivity.class,ResultActivity.class);
startActivity(intent);
}
}
1.6 接收消息
為ResultActivity添加一個(gè)TextView用于展示接收到的數(shù)據(jù)涮拗。
@Subscribe(threadMode = ThreadMode.MAIN) //用注解的方式設(shè)定接收方式
public void ReceiveMessage(MyMessage myMessage){
//顯示接收的消息
mTextView.setText(myMessage.name);
}
這樣我們第一個(gè)EventBus案例就實(shí)現(xiàn)了乾戏。
2.粘性EventBus的使用
2.1-2.2 參考本文1.1與1.2
2.3 創(chuàng)建發(fā)送消息類(與1.4相同)
public class MyMessage {
public String name;
public MyMessage(String name){
this.name = name;
}
}
2.4 發(fā)送消息
這里所使用的就是 EventBus.getDefault().postSticky()方法
mbt_eventBus_sticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//發(fā)送消息
EventBus.getDefault().postSticky(new StickyMessage("這里是粘性事件發(fā)送的數(shù)據(jù)-002"));
//跳轉(zhuǎn)到接收消息的頁(yè)面
Intent intent = new Intent(EventBusActivity.this,ResultActivity.class);
startActivity(intent);
}
});
2.5 接收消息
在確定接收方式之后,需要加上sticky = true
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void ReceiveSticky(StickyMessage stickyMessage){
mTextView.setText(stickyMessage.msg); //這時(shí)雖然已經(jīng)為T(mén)extView賦值三热,但是暫時(shí)不會(huì)顯示出來(lái)鼓择。
}
2.6 注冊(cè)
在ResultActivity設(shè)置一個(gè)按鈕,點(diǎn)擊即注冊(cè)EventBus
這里要注意添加一個(gè)判斷條件就漾,如果EventBus被注冊(cè)多次會(huì)出現(xiàn)異常呐能。
mbt_receiveSticky.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isFirst){
// 注冊(cè)
EventBus.getDefault().register(ResultActivity.this);
isFirst = false;
}else {
Toast.makeText(ResultActivity.this,"你已經(jīng)注冊(cè)過(guò)了EventBus",
Toast.LENGTH_SHORT).show();
}
}
});
2.7解注冊(cè)
重寫(xiě)ResultActivity的onCreate()方法
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().removeAllStickyEvents(); //移除所有的粘性事件
EventBus.getDefault().unregister(ResultActivity.this);
}
到此粘性EventBus的案例也就結(jié)束了。
相關(guān)文章