日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

EventBus的使用(一看就懂)

發布時間:2023/11/27 生活经验 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的使用(一看就懂)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。