RxBus 一个简易、非反射的Android事件通知库

简介: RxBus 一个简易、非反射的Android事件通知库

RxBus


微信截图_20220527220847.png


一个简易的Android事件通知库,使用RxJava和Javassist设计,拒绝使用反射,保证性能高效稳定。


该项目是从RxUtil中分离出RxBus相关,并进行功能增强。如果你对RxJava的使用还不满足于RxBus, 你可以移步RxUtil和RxUtil2。


关于我


微信截图_20220527220948.png


特征


  • 支持多事件定义。


  • 支持自定义数据携带。


  • 支持全局和局部的事件订阅和注销。


  • 支持指定事件订阅响应的线程。


  • 支持使用@Bus注解进行事件订阅和注销。


1、演示(请star支持)


image.gif


2、如何使用


目前支持主流开发工具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方法注册事件,并指定订阅发生在主线程。


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方法注册事件,订阅所在线程为事件发生线程,也可指定订阅发生的线程。


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 + ", 当前线程状态: " + Event.getLooperStatus();
        showContent(msg);
    }
});


方法三:使用@Bus注解修饰方法进行事件注册。


id为注册事件的ID,thread为订阅方法指定的线程。


thread的值:


  • DEFAULT:事件发生的线程(线程不变)


  • 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), "没有数据!");
}


2.3、事件发送


方法一:使用RxBusUtils.get().post(Object eventName)发送不带数据的事件。


RxBusUtils.get().post(EventKey.EVENT_NO_DATA);


方法二:使用RxBusUtils.get().post(Object eventName, Object content)发送携带数据的事件。


RxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, new Event(EventKey.EVENT_HAVE_DATA, "这里携带的是数据"));
RxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, true);


方法三:使用@Bus进行事件注册和注销的需使用RxEventUtils进行事件方式。


  • 发送不带数据的事件


RxEventUtils.post(EventKey.EVENT_NO_DATA_ID);


发送携带数据的事件


RxEventUtils.post(EventKey.EVENT_HAVE_DATA_ID, new Event(EventKey.EVENT_HAVE_DATA, "这里携带的是数据"));


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() {
    }
}



相关文章
|
2月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
35 1
|
2月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
45 1
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
45 5
|
2月前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
4月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
449 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
4月前
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
434 1
|
4月前
|
API Android开发
Android项目架构设计问题之选择和使用合适的UI库如何解决
Android项目架构设计问题之选择和使用合适的UI库如何解决
56 0