RxBus
一個簡易的Android事件通知庫惶楼,使用RxJava和Javassist設計屁魏,拒絕使用反射滔以,保證性能高效穩(wěn)定。
該項目是從RxUtil中分離出RxBus相關氓拼,并進行功能增強你画。如果你對RxJava的使用還不滿足于RxBus, 你可以移步RxUtil和RxUtil2桃漾。
特征
支持多事件定義坏匪。
支持自定義數(shù)據(jù)攜帶。
支持全局和局部的事件訂閱和注銷撬统。
支持指定事件訂閱響應的線程适滓。
支持使用@Bus注解進行事件訂閱和注銷。
1宪摧、演示(請star支持)
2粒竖、如何使用
目前支持主流開發(fā)工具AndroidStudio的使用,直接配置build.gradle几于,增加依賴即可.
2.1蕊苗、添加Gradle依賴
1.先在項目根目錄的 build.gradle 的 repositories 添加:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
2.再在項目根目錄的 build.gradle 的 dependencies 添加Rxbus插件:
buildscript {
···
dependencies {
···
classpath 'com.github.xuexiangjys.RxBus:rxbus-plugin:1.0.0'
}
}
3.在項目的 build.gradle 中增加依賴并引用Rxbus插件
apply plugin: 'com.xuexiang.rxbus' //引用Rxbus插件
dependencies {
...
implementation 'io.reactivex:rxjava:1.3.6'
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'com.github.xuexiangjys.RxBus:rxbus-runtime:1.0.0'
}
2.2、事件注冊訂閱
方法一:使用RxBusUtils.get().onMainThread方法注冊事件沿彭,并指定訂閱發(fā)生在主線程朽砰。
RxBusUtils.get().onMainThread(EventKey.EVENT_HAVE_DATA, new Action1<Event>() {
@Override
public void call(Event event) {
showContent(EventKey.EVENT_HAVE_DATA, event.toString());
}
});
方法二:使用RxBusUtils.get().on方法注冊事件,訂閱所在線程為事件發(fā)生線程喉刘,也可指定訂閱發(fā)生的線程瞧柔。
RxBusUtils.get().on(EventKey.EVENT_BACK_NORMAL, new Action1<String>() {
@Override
public void call(String eventName) {
final String msg = "事件Key:" + EventKey.EVENT_BACK_NORMAL + "\n EventName:" + eventName + ", 當前線程狀態(tài): " + Event.getLooperStatus();
showContent(msg);
}
});
方法三:使用@Bus注解修飾方法進行事件注冊。
id
為注冊事件的ID睦裳,thread
為訂閱方法指定的線程造锅。
thread
的值:
DEFAULT:事件發(fā)生的線程(線程不變)
UI:UI線程(主線程)
IO:IO線程(子線程)
@Bus(id = EventKey.EVENT_HAVE_DATA_ID, thread = Bus.UI)
private void handleHaveDataEvent(Event event) {
showContent(EventKey.EVENT_HAVE_DATA, "EventID" + EventKey.EVENT_HAVE_DATA_ID + "\n" + event.toString());
}
@Bus(id = EventKey.EVENT_NO_DATA_ID, thread = Bus.UI)
private void handleNoDataEvent() {
showContent(String.valueOf(EventKey.EVENT_NO_DATA_ID), "沒有數(shù)據(jù)!");
}
2.3廉邑、事件發(fā)送
方法一:使用RxBusUtils.get().post(Object eventName)發(fā)送不帶數(shù)據(jù)的事件哥蔚。
RxBusUtils.get().post(EventKey.EVENT_NO_DATA);
方法二:使用RxBusUtils.get().post(Object eventName, Object content)發(fā)送攜帶數(shù)據(jù)的事件。
RxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, new Event(EventKey.EVENT_HAVE_DATA, "這里攜帶的是數(shù)據(jù)"));
RxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, true);
方法三:使用@Bus進行事件注冊和注銷的需使用RxEventUtils進行事件方式蛛蒙。
- 發(fā)送不帶數(shù)據(jù)的事件
RxEventUtils.post(EventKey.EVENT_NO_DATA_ID);
- 發(fā)送攜帶數(shù)據(jù)的事件
RxEventUtils.post(EventKey.EVENT_HAVE_DATA_ID, new Event(EventKey.EVENT_HAVE_DATA, "這里攜帶的是數(shù)據(jù)"));
2.4糙箍、事件注銷
1.使用RxBusUtils.get().unregisterAll(Object eventName)取消事件的所有訂閱并注銷事件。
RxBusUtils.get().unregisterAll(EventKey.EVENT_HAVE_DATA);
2.使用RxBusUtils.get().unregister(Object eventName, SubscribeInfo subscribeInfo)取消事件的某個指定訂閱牵祟。
SubscribeInfo是事件注冊訂閱后返回的訂閱信息深夯。如果在取消該訂閱后,該事件如無其他訂閱诺苹,便自動注銷該事件咕晋。
RxBusUtils.get().unregister(EventKey.EVENT_CLEAR, mSubscribeInfo);
3.使用@Bus注冊的事件雹拄,如果是在Activity或者Fragment中,框架會自動進行事件注銷捡需。
當然你也可以主動進行事件注銷:
RxEventUtils.unregisterAll(EventKey.EVENT_HAVE_DATA_ID);
RxEventUtils.unregisterAll(EventKey.EVENT_NO_DATA_ID);
2.5办桨、非activity和fragment使用@BusRegister和@BusUnRegister進行事件的注冊和注銷筹淫。
public class RxEventTest {
public RxEventTest() {
register();
}
@BusRegister
private void register() {
}
@Bus(id = EventKey.EVENT_TEST_ID)
public void getRxEventTest() {
RxLog.e("收到了RxEventTest消息");
}
@BusUnRegister
public void unRegister() {
}
}