通過(guò)RxBus來(lái)實(shí)現(xiàn)事件的通知和訂閱,簡(jiǎn)化應(yīng)用組件間的通信,解耦事件的發(fā)送者和接收者,避免復(fù)雜和容易出錯(cuò)的依賴和生命周期的問(wèn)題.
1. 依賴方式Dependency
1.1 Maven
<dependency>
<groupId>com.hanzhifengyun</groupId>
<artifactId>rxbus</artifactId>
<version>1.0.0</version>
<type>pom</type>
</dependency>
1.2 Gradle
compile 'com.hanzhifengyun:rxbus:1.0.0'
2 如何使用Use
2.1 在合適的時(shí)機(jī)注冊(cè)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在頁(yè)面創(chuàng)建時(shí)訂閱
RxBus.getInstance().register(this);
}
2.2 在合適的時(shí)機(jī)解除注冊(cè)
@Override
protected void onDestroy() {
super.onDestroy();
//在頁(yè)面銷毀時(shí)解除訂閱,防止頁(yè)面銷毀后導(dǎo)致內(nèi)存溢出
RxBus.getInstance().unRegister(this);
}
2.3 如何發(fā)送事件
-
只發(fā)送事件code,不包含數(shù)據(jù),一般用于通知某一事件的發(fā)生
RxBus.getInstance().send(int code); -
只發(fā)送事件數(shù)據(jù),不包含code,一般用于所有關(guān)心相同類型數(shù)據(jù)變化的接收者
RxBus.getInstance().send(Object data); -
根據(jù)不同code發(fā)送事件數(shù)據(jù),只有相同的code和數(shù)據(jù)類型的接收者才能接收到數(shù)據(jù)
RxBus.getInstance().send(int code, Object data);
2.4 如何接收事件
- 在已經(jīng)注冊(cè)過(guò)的類中自定義一個(gè)public方法,方法名隨意,參數(shù)填寫需要接收數(shù)據(jù)的類型.
- 在方法上添加注解OnSubscribe,表示接收訂閱的信息:
- code: 用于區(qū)分發(fā)送的不同事件的標(biāo)識(shí),int類型
- threadType: 標(biāo)識(shí)事件接收時(shí)回調(diào)在什么線程
2.5 例子:
- 只關(guān)心事件類型,不包含數(shù)據(jù)
-
定義事件類型
public static final int CODE_PAY_SUCCESS = 3;//支付成功事件 -
發(fā)送事件
RxBus.getInstance().send(CODE_PAY_SUCCESS); -
接收事件,并在UI主線程中消費(fèi)
@OnSubscribe(code = CODE_PAY_SUCCESS, threadType = ThreadType.UI) public void onPaySuccess() { //do something after pay success… }
- 只關(guān)心事件數(shù)據(jù)
-
發(fā)送事件,只包含數(shù)據(jù)
List<String> dataList = new ArrayList<>(); dataList.add("a"); dataList.add("b"); dataList.add("c"); RxBus.getInstance().send(dataList); -
接收數(shù)據(jù),并在IO子線程中消費(fèi)
@OnSubscribe(threadType = ThreadType. IO) public void onDataChanged(List<String> dataList) { // do something for data… }
- 只關(guān)心特定的事件類型和特定的數(shù)據(jù)
-
定義事件類型
public static final int CODE_LOAD_DATA = 9;//加載數(shù)據(jù)事件 -
發(fā)送事件
List<String> dataList = new ArrayList<>(); dataList.add("a"); dataList.add("b"); dataList.add("c"); RxBus.getInstance().send(CODE_LOAD_DATA, dataList); -
接收數(shù)據(jù),并在CURRENT_THREAD當(dāng)前線程中消費(fèi)
@OnSubscribe(code = CODE_LOAD_DATA, threadType = ThreadType. CURRENT_THREAD) public void onDataChanged(List<String> dataList) { // do something for data… }
具體實(shí)現(xiàn)感興趣的可以查看源碼,希望對(duì)大家的學(xué)習(xí)有所幫助。
項(xiàng)目地址: https://github.com/hanzhifengyun/RxBus