{"id":19765758,"url":"https://github.com/xuexiangjys/rxutil2","last_synced_at":"2025-04-30T15:31:02.595Z","repository":{"id":101672029,"uuid":"129124895","full_name":"xuexiangjys/RxUtil2","owner":"xuexiangjys","description":"一个实用的RxJava2工具类库","archived":false,"fork":false,"pushed_at":"2023-12-15T05:51:04.000Z","size":1708,"stargazers_count":88,"open_issues_count":1,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-02-29T16:31:34.566Z","etag":null,"topics":["android","rxandroid2","rxbus","rxjava2","x-library"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xuexiangjys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2018-04-11T16:46:26.000Z","updated_at":"2023-12-21T09:40:29.000Z","dependencies_parsed_at":"2024-02-14T03:41:32.580Z","dependency_job_id":null,"html_url":"https://github.com/xuexiangjys/RxUtil2","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FRxUtil2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FRxUtil2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FRxUtil2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xuexiangjys%2FRxUtil2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xuexiangjys","download_url":"https://codeload.github.com/xuexiangjys/RxUtil2/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224214877,"owners_count":17274700,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","rxandroid2","rxbus","rxjava2","x-library"],"created_at":"2024-11-12T04:19:21.484Z","updated_at":"2024-11-12T04:19:22.250Z","avatar_url":"https://github.com/xuexiangjys.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RxUtil2\n\n[![](https://jitpack.io/v/xuexiangjys/RxUtil2.svg)](https://jitpack.io/#xuexiangjys/RxUtil2)\n[![api](https://img.shields.io/badge/API-14+-brightgreen.svg)](https://android-arsenal.com/api?level=14)\n[![I](https://img.shields.io/github/issues/xuexiangjys/RxUtil2.svg)](https://github.com/xuexiangjys/RxUtil2/issues)\n[![Star](https://img.shields.io/github/stars/xuexiangjys/RxUtil2.svg)](https://github.com/xuexiangjys/RxUtil2)\n\n一个实用的RxJava2工具类库。\n\n\u003e 如果你习惯RxJava1，请移步[RxUtil](https://github.com/xuexiangjys/RxUtil)\n\n## 关于我\n\n| 公众号   | 掘金     |  知乎    |  CSDN   |   简书   |   思否  |   哔哩哔哩  |   今日头条\n|---------|---------|--------- |---------|---------|---------|---------|---------|\n| [我的Android开源之旅](https://ss.im5i.com/2021/06/14/6tqAU.png)  |  [点我](https://juejin.im/user/598feef55188257d592e56ed/posts)    |   [点我](https://www.zhihu.com/people/xuexiangjys/posts)       |   [点我](https://xuexiangjys.blog.csdn.net/)  |   [点我](https://www.jianshu.com/u/6bf605575337)  |   [点我](https://segmentfault.com/u/xuexiangjys)  |   [点我](https://space.bilibili.com/483850585)  |   [点我](https://img.rruu.net/image/5ff34ff7b02dd)\n\n## 特征\n\n* RxBus 支持多事件定义，支持数据携带，支持全局和局部的事件订阅和注销。\n* 订阅池管理。\n* 支持非侵入式的订阅生命周期绑定。\n* 线程调度辅助工具。\n* RxBinding 使用工具类。\n* RxJava常用方法工具类。\n\n## 1、演示（请star支持）\n\n### 1.1、RxBus\n\n![](https://z3.ax1x.com/2021/06/14/2HSkgU.gif)\n\n## 2、如何使用\n\n目前支持主流开发工具AndroidStudio的使用，直接配置build.gradle，增加依赖即可.\n\n### 2.1、Android Studio导入方法，添加Gradle依赖\n\n1.先在项目根目录的 build.gradle 的 repositories 添加:\n\n```\nallprojects {\n     repositories {\n        ...\n        maven { url \"https://jitpack.io\" }\n    }\n}\n```\n\n2.然后在应用项目(一般是app)的 `build.gradle` 的 dependencies 添加:\n\n```\ndependencies {\n   ...\n   implementation 'io.reactivex.rxjava2:rxjava:2.2.20'\n   implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'\n   //rxbinding的sdk\n   implementation 'com.jakewharton.rxbinding2:rxbinding:2.2.0'\n\n   implementation 'com.github.xuexiangjys:RxUtil2:1.2.0'\n}\n```\n\n### 3.1、RxBus使用\n\n#### 3.1.1、事件注册订阅\n\n1.使用`RxBusUtils.get().onMainThread`方法注册事件，并指定订阅发生在主线程。\n\n```\nRxBusUtils.get().onMainThread(EventKey.EVENT_HAVE_DATA, Event.class, new Consumer\u003cEvent\u003e() {\n    @Override\n    public void accept(Event event) throws Exception {\n        showContent(EventKey.EVENT_HAVE_DATA, event.toString());\n    }\n});\n```\n2.使用`RxBusUtils.get().on`方法注册事件，订阅所在线程为事件发生线程，也可指定订阅发生的线程。\n\n```\nRxBusUtils.get().on(EventKey.EVENT_BACK_NORMAL, String.class, new Consumer\u003cString\u003e() {\n    @Override\n    public void accept(String eventName) throws Exception {\n        final String msg = \"事件Key:\" + EventKey.EVENT_BACK_NORMAL + \"\\n   EventName:\" + eventName + \", 当前线程状态： \" + Event.getLooperStatus();\n        showContent(msg);\n    }\n});\n```\n\n3.与RxBus1相比，使用RxJava2的RxBus2需要指定接收数据的类型，但如果使用默认的`RxEvent`进行事件注册, 就不需要指定类型了。\n\n```\nRxBusUtils.get().onMainThread(EventKey.EVENT_NO_DATA, new Consumer\u003cRxEvent\u003e() {\n    @Override\n    public void accept(RxEvent rxEvent) throws Exception {\n        showContent(rxEvent.toString());\n    }\n});\n```\n\n\n#### 3.1.2、事件发送\n\n1.使用`RxBusUtils.get().post(Object eventName)`发送不带数据的事件。\n```\nRxBusUtils.get().post(EventKey.EVENT_NO_DATA);\n\nRxBusUtils.get().postRxEvent(EventKey.EVENT_NO_DATA); //发送使用RxEvent注册的事件\n```\n\n2.使用`RxBusUtils.get().post(Object eventName, Object content)`发送携带数据的事件。\n```\nRxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, new Event(EventKey.EVENT_HAVE_DATA, \"这里携带的是数据\"));\nRxBusUtils.get().post(EventKey.EVENT_HAVE_DATA, true);\n```\n\n#### 3.1.3、事件注销\n\n1.使用`RxBusUtils.get().unregisterAll(Object eventName)`取消事件的所有订阅并注销事件。\n```\nRxBusUtils.get().unregisterAll(EventKey.EVENT_HAVE_DATA);\n```\n\n2.使用`RxBusUtils.get().unregister(Object eventName, SubscribeInfo subscribeInfo)`取消事件的某个指定订阅。\nSubscribeInfo是事件注册订阅后返回的订阅信息。如果在取消该订阅后，该事件如无其他订阅，便自动注销该事件。\n```\nRxBusUtils.get().unregister(EventKey.EVENT_CLEAR, mSubscribeInfo);\n```\n\n### 3.2、RxJavaUtils使用\n\n#### 3.2.1、线程任务\n\n1.RxIOTask：在io线程中操作的任务\n```\nRxJavaUtils.doInIOThread(new RxIOTask\u003cString\u003e(\"我是入参123\") {\n    @Override\n    public Void doInIOThread(String s) {\n        Log.e(TAG, \"[doInIOThread]  \" + getLooperStatus() + \", 入参:\" + s);\n        return null;\n    }\n});\n```\n\n2.RxUITask：在UI线程中操作的任务\n\n```\nRxJavaUtils.doInUIThread(new RxUITask\u003cString\u003e(\"我是入参456\") {\n    @Override\n    public void doInUIThread(String s) {\n        Log.e(TAG, \"[doInUIThread]  \" + getLooperStatus() + \", 入参:\" + s);\n    }\n});\n```\n\n3.RxAsyncTask：在IO线程中执行耗时操作 执行完成后在UI线程中订阅的任务。\n```\nRxJavaUtils.executeAsyncTask(new RxAsyncTask\u003cString, Integer\u003e(\"我是入参789\") {\n    @Override\n    public Integer doInIOThread(String s) {\n        Log.e(TAG, \"[doInIOThread]  \" + getLooperStatus() + \", 入参:\" + s);\n        return 12345;\n    }\n\n    @Override\n    public void doInUIThread(Integer integer) {\n        Log.e(TAG, \"[doInUIThread]  \" + getLooperStatus() + \", 入参:\" + integer);\n    }\n});\n```\n\n4.RxIteratorTask:遍历集合或者数组的任务，在IO线程中执行耗时操作 执行完成后在UI线程中订阅的任务。\n```\nRxJavaUtils.executeRxIteratorTask(new RxIteratorTask\u003cString, Integer\u003e(new String[]{\"123\", \"456\", \"789\"}) {\n    @Override\n    public Integer doInIOThread(String s) {\n        RxLog.e(\"[doInIOThread]\" + getLooperStatus() + \", 入参:\" + s);\n        return Integer.parseInt(s);\n    }\n\n    @Override\n    public void doInUIThread(Integer integer) {\n        RxLog.e(\"[doInUIThread]  \" + getLooperStatus() + \", 入参:\" + integer);\n    }\n});\n```\n\n#### 3.2.2、订阅者Subscriber\n\n1.SimpleSubscriber：简单的订阅者，已对错误进行捕获处理，并对生命周期进行日志记录。可设置IExceptionHandler接口自定义错误处理，设置ILogger接口自定义日志记录。\n\n2.ProgressLoadingSubscriber：带进度条加载的订阅者，实现`IProgressLoader`接口可自定义加载方式。\n```\nObservable.just(\"加载完毕！\")\n        .delay(3, TimeUnit.SECONDS)\n        .observeOn(AndroidSchedulers.mainThread())\n        .subscribe(new ProgressLoadingSubscriber\u003cString\u003e(mProgressLoader) {\n            @Override\n            public void onNext(String s) {\n                Toast.makeText(RxJavaActivity.this, s, Toast.LENGTH_SHORT).show();\n            }\n        });\n```\n\n### 3.3、DisposablePool使用\n\nDisposablePool：RxJava的订阅池\n\n1.增加订阅：`add(@NonNull Object tagName, Disposable disposable)` 或者 `add(Disposable disposable, @NonNull Object tagName)`\n```\nDisposablePool.get().add(RxJavaUtils.polling(5, new Consumer\u003cLong\u003e() {\n    @Override\n    public void accept(Long o) throws Exception {\n        Toast.makeText(RxJavaActivity.this, \"正在监听\", Toast.LENGTH_SHORT).show();\n    }\n}), \"polling\");\n```\n\n2.取消订阅：`remove(@NonNull Object tagName)`、`remove(@NonNull Object tagName, Disposable disposable)`、`removeAll()`\n```\nDisposablePool.get().remove(\"polling\");\n```\n\n### 3.4、RxBindingUtils使用\n\n1.setViewClicks:设置点击事件\n```\nRxBindingUtils.setViewClicks(mBtnClick, 5, TimeUnit.SECONDS, new Action1\u003cObject\u003e() {\n    @Override\n    public void call(Object o) {\n        toast(\"触发点击\");\n    }\n});\n```\n\n2.setItemClicks:设置条目点击事件\n\n\n### 3.5、RxSchedulerUtils使用\n\n1. 订阅发生在主线程 （  -\u003e  -\u003e main)\n\n```\n.compose(RxSchedulerUtils.\u003cT\u003e_main_o())  //Observable使用\n.compose(RxSchedulerUtils.\u003cT\u003e_main_f())  //Flowable使用\n\n```\n\n2. 订阅发生在io线程 （  -\u003e  -\u003e io)\n\n```\n.compose(RxSchedulerUtils.\u003cT\u003e_io_o())  //Observable使用\n.compose(RxSchedulerUtils.\u003cT\u003e_io_f())  //Flowable使用\n\n```\n\n3. 处理在io线程，订阅发生在主线程（ -\u003e io -\u003e main)\n\n```\n.compose(RxSchedulerUtils.\u003cT\u003e_io_main_o()) //Observable使用\n.compose(RxSchedulerUtils.\u003cT\u003e_io_main_f()) //Flowable使用\n\n```\n\n4. 处理在io线程，订阅也发生在io线程（ -\u003e io -\u003e io)\n\n```\n.compose(RxSchedulerUtils.\u003cT\u003e_io_io_o()) //Observable使用\n.compose(RxSchedulerUtils.\u003cT\u003e_io_io_f()) //Flowable使用\n\n```\n\n5. 自定义线程池\n\n由于`Schedulers.io()`内部使用的是`CachedWorkerPool`，而他最终创建线程池的方法是`newScheduledThreadPool`，它是一个核心只有1个线程，有效时间为60s，但是线程池的线程容纳数量是`Integer.MAX_VALUE`的线程池。\n\n如果线程在执行的过程中发生了长时间的阻塞，导致线程一直在工作状态的话，线程池将无法回收线程，只能不断地创建线程，最终有可能造成线程创建的数量过多，导致程序OOM。\n\n使用`RxSchedulerUtils.setIOExecutor`可以替换工具类中使用的io线程：\n\n```\nRxSchedulerUtils.setIOExecutor(AppExecutors.get().poolIO()); //全局替换\n\n.compose(new SchedulerTransformer\u003cInteger\u003e(AppExecutors.get().poolIO())) //局部替换\n```\n\n### 3.6、RxLifecycle使用\n\n1.使用`RxLifecycle.injectRxLifecycle`进行生命周期的绑定。\n\n（1）在Activity的`onCreate`方法中进行注入和生命周期绑定\n\n```\n@Override\nprotected void onCreate(@Nullable Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(getLayoutId());\n    RxLifecycle.injectRxLifecycle(this);\n}\n```\n（2）当然，如果你嫌麻烦，可以在Application的`onCreate`方法中进行注入和生命周期绑定。\n\n```\nRxLifecycle.injectRxLifecycle(this);\n```\n\n2.使用`compose`将订阅绑定至生命周期。\n\n使用`RxLifecycle.with`可以获取生命周期管理者`LifecycleManager`，通过它我们可以将订阅绑定至生命周期。\n\n* `bindToActivityLifecycle`:绑定到特定的Activity生命周期进行订阅注销\n\n* `bindToLifecycle`:自动绑定Activity生命周期进行订阅注销\n\n* `bindOnDestroy`:绑定到Activity的OnDestroy进行订阅注销\n\n```\nRxJavaUtils.polling(5)\n        .compose(RxLifecycle.with(this).\u003cLong\u003ebindToLifecycle())\n        .subscribe(new SimpleSubscriber\u003cLong\u003e() {\n            @Override\n            public void onNext(Long aLong) {\n                toast(\" 正在监听 :\" + aLong);\n            }\n        });\n```\n\n## 公众号\n\n\u003e 更多资讯内容，欢迎扫描关注我的个人微信公众号:【我的Android开源之旅】\n\n![gzh_weixin.jpg](https://ss.im5i.com/2021/06/14/65yoL.jpg)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuexiangjys%2Frxutil2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxuexiangjys%2Frxutil2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxuexiangjys%2Frxutil2/lists"}