在這里介紹一下EventBus的用途怕犁,EventBus是一款針對(duì)Android優(yōu)化的發(fā)布/訂閱事件總線哨苛。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity篮赢,Service齿椅,線程之間傳遞消息.優(yōu)點(diǎn)是開(kāi)銷(xiāo)小,代碼更優(yōu)雅启泣。以及將發(fā)送者和接收者解耦涣脚。
可以應(yīng)用于Activity和fragment之間碎片和碎片之間主線程與子線程之間等場(chǎng)景。
**
下面我們先了解一下如何利用EventBus在不同線程之間傳值寥茫。
**
一遣蚀,步入正題,首先導(dǎo)入依賴(lài)纱耻。
compile 'org.greenrobot:eventbus:3.0.0'
二芭梯,注冊(cè)與取消注冊(cè)
1.在onCreate方法里添加注冊(cè)代碼
EventBus.getDefault().register(this);
2.在onDestroy()方法取消注冊(cè)
EventBus.getDefault().unregister(this);
三.在需要接受消息的界面添加訂閱方法(添加在方法區(qū)中)
@Subscribe(threadMode = ThreadMode.MAIN)//MAIN代表主線程
public void receiveMessage(String json){//該方法名可更改,不影響任何東西膝迎。
//在主線程中獲取子線程發(fā)送來(lái)的消息設(shè)置到TextView中
tv.setText(event.getResult());
}
四.在方法區(qū)編寫(xiě)發(fā)送消息的方法
public void loadData(final String url){
new Thread(){
@Override
public void run() {
super.run();
String json = 通過(guò)url獲取網(wǎng)絡(luò)數(shù)據(jù)賦值給json
//在子線程當(dāng)中發(fā)送數(shù)據(jù)給主線程
EventBus.getDefault().post(json);
}
}.start();
}
五.在OnCreate方法中啟動(dòng)發(fā)送消息的方法粥帚。
loadData(url);
到此為止我們已經(jīng)可以簡(jiǎn)單的使用EventBus了。
**
接下來(lái)我們來(lái)了解一下EventBus如何在不同界面接收特定消息
**
下面我們想一個(gè)問(wèn)題限次,如果我在其他activity中同樣注冊(cè)EventBus并添加訂閱方法會(huì)不會(huì)一樣收到消息呢芒涡?答案是可以。
如下:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveMessage(String json){
//此處依然可以收到剛才我們所發(fā)送的消息
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
那我們?nèi)绾问共煌慕缑媸盏教囟ǖ南⒛兀?br>
其實(shí)很簡(jiǎn)單
1.我們先創(chuàng)建一個(gè)最基礎(chǔ)的Java類(lèi)卖漫。例如
public class MessageEvent {
private String recode;
private String result;
private String msg;
public String getRecode() {
return recode;
}
public void setRecode(String recode) {
this.recode = recode;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public MessageEvent() {
}
public MessageEvent(String recode, String result, String msg) {
this.recode = recode;
this.result = result;
this.msg = msg;
}
}
2.然后我們?cè)诎l(fā)送數(shù)據(jù)時(shí)费尽,新建這個(gè)類(lèi),將要發(fā)送的消息賦值給這個(gè)類(lèi)的成員羊始,最后發(fā)送這個(gè)類(lèi)對(duì)象旱幼。如下:
public void loadData(final String url){
new Thread(){
@Override
public void run() {
super.run();
String json = 通過(guò)url獲取網(wǎng)絡(luò)數(shù)據(jù)賦值給json
MessageEvent messageEvent = new MessageEvent("recode",json,"msg");
//在子線程當(dāng)中發(fā)布類(lèi)給主線程
EventBus.getDefault().post(messageEvent);
}
}.start();
}
3.而在接收消息的時(shí)候,我們將訂閱方法所接收的類(lèi)型改成我們發(fā)送類(lèi)的類(lèi)型突委。就可以做到只接收此類(lèi)型的消息柏卤。
@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveMessage(MessageEvent event){
tv.setText(event.getResult());
}
到此為止相信大家已經(jīng)對(duì)EventBus有了一定的了解。
**
下面我們?nèi)绾问褂肊ventBus來(lái)完成Activity與Fragment之間匀油、fragment與fragment之間的傳值缘缚。
**
其實(shí)有了上面文章的基礎(chǔ)我們利用EventBus來(lái)完成各界面之間的傳值就非常簡(jiǎn)單了。
一敌蚜,肯定是要先導(dǎo)入jar包的桥滨。
二,其次我們?cè)谙胍邮障⒌慕缑嫱瓿缮鲜鲎?cè)和取消注冊(cè)的步驟并添加訂閱方法。
三齐媒,可將發(fā)送消息的方法添加到任意你想發(fā)送消息的地方蒲每,比如說(shuō)某個(gè)界面的onCreate中或者某個(gè)界面的監(jiān)聽(tīng)方法中。發(fā)送的可以是字符串也可以是某個(gè)含有屬性的對(duì)象喻括。只要對(duì)應(yīng)接收就好邀杏。
//發(fā)送數(shù)據(jù)給訂閱方法
EventBus.getDefault().post(json);
當(dāng)我們啟動(dòng)了發(fā)送數(shù)據(jù)的方法,如果相應(yīng)界面訂閱方法所訂閱的數(shù)據(jù)類(lèi)型與發(fā)送數(shù)據(jù)的數(shù)據(jù)類(lèi)型一致就會(huì)接收到相應(yīng)的數(shù)據(jù)双妨。
如果還有什么不明白的地方可在博客下方留言淮阐。