EventBus的使用(一看就懂)
今天使用EventBus 遇到一個(gè)小bug ,這里記錄下其使用
先啰嗦一下,這邊博客是說(shuō)怎樣使用的,沒(méi)有涉及到什么原理,在看之前,你或許百度了很多博客
都是MainActivity 接受消息,SecondActivity 發(fā)送消息。 感覺(jué)怪怪的,怎么大家都一樣,。。。。
后來(lái)自己測(cè)試法知道原因,這里只是自己的猜測(cè)
我們一般都是先啟動(dòng)MainActivity ,跳轉(zhuǎn)到SecondActivity ,,此時(shí),棧中存在2個(gè)activity ,那么 SecondActivity
返回MainActivity ,MainActivity存在棧中,不會(huì)遇到post發(fā)送消息了,MainActivity還沒(méi)創(chuàng)建的情況
這樣就避免了消息接受不到的情況了,好像大家都是測(cè)試,沒(méi)有說(shuō)這一點(diǎn)。
解釋下粘性發(fā)送,就是消息接受不會(huì),會(huì)一直發(fā)送。
使用 方法
(如果不知道使用就先把它當(dāng)作intent 傳值,這個(gè)熟悉把,下面演示下效果)
1 先導(dǎo)入EventBus庫(kù)
implementation 'org.greenrobot:eventbus:3.1.1'
我打算MainActivity發(fā)送消息,SecondActivity 接受消息,但是為了保證能收到消息,使用粘性發(fā)送
發(fā)送消息
public class Morning extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.morining_activity_layout);findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {EventBus.getDefault().postSticky(new MessageBean("小牧","18"));Intent intent = new Intent(Morning.this, NoonActivity.class);startActivity(intent);}});}
}
MessageBean代碼如下
public class MessageBean {private String name;private String age;public MessageBean(String name, String age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}
}
然后就可以在其界面接受值了
public class EveningActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.evening_activity_layout);//注冊(cè)事件EventBus.getDefault().register(this);}//事件訂閱者處理事件@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)public void onEvent(MessageBean messageBean){if (null !=messageBean){Log.e("==========xiaomu",messageBean.getName());Log.e("==========xiaomu",messageBean.getAge()+"");}else{Log.e("==========xiaomu","messageBean為空");}}@Overrideprotected void onDestroy() {super.onDestroy();//取消注冊(cè)事件EventBus.getDefault().unregister(this);}}
?
EventBus四種ThreadMode:
POSTING(默認(rèn)):如果使用事件處理函數(shù)指定了線(xiàn)程模型為POSTING,那么該事件在哪個(gè)線(xiàn)程發(fā)布出來(lái)的,事件處理函數(shù)就會(huì)在這個(gè)線(xiàn)程中運(yùn)行,也就是說(shuō)發(fā)布事件和接收事件在同一個(gè)線(xiàn)程。在線(xiàn)程模型為POSTING的事件處理函數(shù)中盡量避免執(zhí)行耗時(shí)操作,因?yàn)樗鼤?huì)阻塞事件的傳遞,甚至有可能會(huì)引起ANR。
MAIN:?
事件的處理會(huì)在UI線(xiàn)程中執(zhí)行。事件處理時(shí)間不能太長(zhǎng),長(zhǎng)了會(huì)ANR的。
BACKGROUND:如果事件是在UI線(xiàn)程中發(fā)布出來(lái)的,那么該事件處理函數(shù)就會(huì)在新的線(xiàn)程中運(yùn)行,如果事件本來(lái)就是子線(xiàn)程中發(fā)布出來(lái)的,那么該事件處理函數(shù)直接在發(fā)布事件的線(xiàn)程中執(zhí)行。在此事件處理函數(shù)中禁止進(jìn)行UI更新操作。
ASYNC:無(wú)論事件在哪個(gè)線(xiàn)程發(fā)布,該事件處理函數(shù)都會(huì)在新建的子線(xiàn)程中執(zhí)行,同樣,此事件處理函數(shù)中禁止進(jìn)行UI更新操作。
我個(gè)人把EventBus理解為Intent 傳值的升級(jí)版本,即使不知道其原理使用也是很簡(jiǎn)單的。
?
總結(jié)
以上是生活随笔為你收集整理的EventBus的使用(一看就懂)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 求一个qq网名女简短!
- 下一篇: 黄金一斤多少钱啊?