一个RxJava实用工具类的集合 - CSDN博客

简介: 一个RxJava实用工具类的集合 - CSDN博客

RxUtil


微信截图_20220514152832.png


一个实用的RxJava1工具类库


如果你使用的是RxJava2,请移步RxUtil2


关于我


微信截图_20220514153732.png


内容


  • RxBus 支持多事件定义,支持数据携带,支持全局和局部的事件订阅和注销


  • 订阅池管理


  • 线程调度辅助工具


  • RxBinding 使用工具类


  • RxJava常用方法工具类


1、演示(请star支持)


1.1、RxBus


微信截图_20220514162604.png


2、如何使用


目前支持主流开发工具AndroidStudio的使用,直接配置build.gradle,增加依赖即可.


2.1、Android Studio导入方法,添加Gradle依赖


先在项目根目录的 build.gradle 的 repositories 添加:


allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}


然后在dependencies添加:


dependencies {
   ...
   implementation 'io.reactivex:rxjava:1.2.9'
   implementation 'io.reactivex:rxandroid:1.2.1'
   implementation 'com.github.xuexiangjys:RxUtil:1.1'
}


3.1、RxBus使用


3.1.1、事件注册订阅


1.使用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());
    }
});


2.使用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);
    }
});


3.1.2、事件发送


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


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


2.使用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);


3.1.3、事件注销


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.2、RxJavaUtils使用


3.2.1、线程任务


1.RxIOTask:在io线程中操作的任务


RxJavaUtils.doInIOThread(new RxIOTask<String>("我是入参123") {
    @Override
    public Void doInIOThread(String s) {
        Log.e(TAG, "[doInIOThread]  " + getLooperStatus() + ", 入参:" + s);
        return null;
    }
});


2.RxUITask:在UI线程中操作的任务


RxJavaUtils.doInUIThread(new RxUITask<String>("我是入参456") {
    @Override
    public void doInUIThread(String s) {
        Log.e(TAG, "[doInUIThread]  " + getLooperStatus() + ", 入参:" + s);
    }
});


3.RxAsyncTask:在IO线程中执行耗时操作 执行完成后在UI线程中订阅的任务。


RxJavaUtils.executeAsyncTask(new RxAsyncTask<String, Integer>("我是入参789") {
    @Override
    public Integer doInIOThread(String s) {
        Log.e(TAG, "[doInIOThread]  " + getLooperStatus() + ", 入参:" + s);
        return 12345;
    }
    @Override
    public void doInUIThread(Integer integer) {
        Log.e(TAG, "[doInUIThread]  " + getLooperStatus() + ", 入参:" + integer);
    }
});


4.RxIteratorTask:遍历集合或者数组的任务,在IO线程中执行耗时操作 执行完成后在UI线程中订阅的任务。


RxJavaUtils.executeRxIteratorTask(new RxIteratorTask<String, Integer>(new String[]{"123", "456", "789"}) {
    @Override
    public Integer doInIOThread(String s) {
        RxLog.e("[doInIOThread]" + getLooperStatus() + ", 入参:" + s);
        return Integer.parseInt(s);
    }
    @Override
    public void doInUIThread(Integer integer) {
        RxLog.e("[doInUIThread]  " + getLooperStatus() + ", 入参:" + integer);
    }
});


3.2.2、订阅者Subscriber


1.SimpleSubscriber:简单的订阅者,已对错误进行捕获处理,并对生命周期进行日志记录。可设置IExceptionHandler接口自定义错误处理,设置ILogger接口自定义日志记录。

2.ProgressLoadingSubscriber:带进度条加载的订阅者,实现IProgressLoader接口可自定义加载方式。


Observable.just("加载完毕!")
    .delay(3, TimeUnit.SECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new ProgressLoadingSubscriber<String>(mProgressLoader) {
        @Override
        public void onNext(String s) {
            Toast.makeText(RxJavaActivity.this, s, Toast.LENGTH_SHORT).show();
        }
    });


3.3、SubscriptionPool使用


SubscriptionPool:RxJava的订阅池

1.增加订阅:add(@NonNull Object tagName, Subscription m) 或者 add(Subscription m, @NonNull Object tagName)


SubscriptionPool.get().add(RxJavaUtils.polling(5, new Action1() {
    @Override
    public void call(Object o) {
        Toast.makeText(RxJavaActivity.this, "正在监听", Toast.LENGTH_SHORT).show();
    }
}), "polling");


2.取消订阅:remove(@NonNull Object tagName)、remove(@NonNull Object tagName, Subscription m)、removeAll()


SubscriptionPool.get().remove("polling");


3.4、RxBindingUtils使用


1.setViewClicks:设置点击事件


RxBindingUtils.setViewClicks(mBtnClick, 5, TimeUnit.SECONDS, new Action1<Void>() {
    @Override
    public void call(Void aVoid) {
        toast("触发点击");
    }
});


2.setItemClicks:设置条目点击事件


3.5、RxSchedulerUtils使用


  1. 订阅发生在主线程 ( -> -> main)


.compose(RxSchedulerUtils.<T>_main())


1.订阅发生在io线程 ( -> -> io)


.compose(RxSchedulerUtils.<T>_io())


1.处理在io线程,订阅发生在主线程( -> io -> main)


.compose(RxSchedulerUtils.<T>_io_main())


1.处理在io线程,订阅也发生在io线程( -> io -> io)


.compose(RxSchedulerUtils.<T>_io_io())
相关文章
|
6月前
|
安全 Java
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
|
6月前
|
Java API
从零开始学习 Java:简单易懂的入门指南之File类(二十九)
从零开始学习 Java:简单易懂的入门指南之File类(二十九)
|
5月前
|
Python
Python基础教程(第3版)中文版 第9章 魔法方法、特性和迭代器(笔记)
Python基础教程(第3版)中文版 第9章 魔法方法、特性和迭代器(笔记)
|
6月前
|
存储 安全 Java
从零开始学习 Java:简单易懂的入门指南之泛型及set集合(二十二)
从零开始学习 Java:简单易懂的入门指南之泛型及set集合(二十二)
|
6月前
|
存储 Java 索引
从零开始学习 Java:简单易懂的入门指南之Collection集合及list集合(二十一)
从零开始学习 Java:简单易懂的入门指南之Collection集合及list集合(二十一)
|
6月前
|
存储 Java
从零开始学习 Java:简单易懂的入门指南之Stream流(二十七)
从零开始学习 Java:简单易懂的入门指南之Stream流(二十七)
|
6月前
|
存储 Java
从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)
从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)
|
Java 程序员
从零开始学习 Java:简单易懂的入门指南之抽象类&接口&内部类(十一)
从零开始学习 Java:简单易懂的入门指南之抽象类&接口&内部类(十一)
|
存储 算法 Java
java 一文讲透API [常用类 + 常用工具](20万字博文)
java API——常用类 和 API——常用工具 全面总结。20万字深度讲解。
1236 0
|
Java
java学习第七天笔记-方法150-封装2方法使用
java学习第七天笔记-方法150-封装2方法使用
68 0
java学习第七天笔记-方法150-封装2方法使用