EventBus的使用(一看就懂)
今天使用EventBus 遇到一個小bug ,這里記錄下其使用
先啰嗦一下,這邊博客是說怎樣使用的,沒有涉及到什么原理,在看之前,你或許百度了很多博客
都是MainActivity 接受消息,SecondActivity 發送消息。 感覺怪怪的,怎么大家都一樣,。。。。
后來自己測試法知道原因,這里只是自己的猜測
我們一般都是先啟動MainActivity ,跳轉到SecondActivity ,,此時,棧中存在2個activity ,那么 SecondActivity
返回MainActivity ,MainActivity存在棧中,不會遇到post發送消息了,MainActivity還沒創建的情況
這樣就避免了消息接受不到的情況了,好像大家都是測試,沒有說這一點。
解釋下粘性發送,就是消息接受不會,會一直發送。
使用 方法
(如果不知道使用就先把它當作intent 傳值,這個熟悉把,下面演示下效果)
1 先導入EventBus庫
implementation 'org.greenrobot:eventbus:3.1.1'
我打算MainActivity發送消息,SecondActivity 接受消息,但是為了保證能收到消息,使用粘性發送
發送消息
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);//注冊事件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();//取消注冊事件EventBus.getDefault().unregister(this);}}
?
EventBus四種ThreadMode:
POSTING(默認):如果使用事件處理函數指定了線程模型為POSTING,那么該事件在哪個線程發布出來的,事件處理函數就會在這個線程中運行,也就是說發布事件和接收事件在同一個線程。在線程模型為POSTING的事件處理函數中盡量避免執行耗時操作,因為它會阻塞事件的傳遞,甚至有可能會引起ANR。
MAIN:?
事件的處理會在UI線程中執行。事件處理時間不能太長,長了會ANR的。
BACKGROUND:如果事件是在UI線程中發布出來的,那么該事件處理函數就會在新的線程中運行,如果事件本來就是子線程中發布出來的,那么該事件處理函數直接在發布事件的線程中執行。在此事件處理函數中禁止進行UI更新操作。
ASYNC:無論事件在哪個線程發布,該事件處理函數都會在新建的子線程中執行,同樣,此事件處理函數中禁止進行UI更新操作。
我個人把EventBus理解為Intent 傳值的升級版本,即使不知道其原理使用也是很簡單的。
?
總結
以上是生活随笔為你收集整理的EventBus的使用(一看就懂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个qq网名女简短!
- 下一篇: Lint found fatal err