{"id":20609658,"url":"https://github.com/blankj/rxbus","last_synced_at":"2025-04-09T14:09:36.135Z","repository":{"id":109048940,"uuid":"132248956","full_name":"Blankj/RxBus","owner":"Blankj","description":":bus: The RxBus as steady as an old dog.","archived":false,"fork":false,"pushed_at":"2020-12-10T15:26:28.000Z","size":1270,"stargazers_count":344,"open_issues_count":3,"forks_count":41,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-04-02T12:09:28.890Z","etag":null,"topics":["eventbus","rxandroid","rxandroid2","rxbus","rxbus2","rxjava","rxjava2"],"latest_commit_sha":null,"homepage":"https://blankj.com/2018/05/09/awesome-rxbus","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/Blankj.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"publiccode":null,"codemeta":null}},"created_at":"2018-05-05T13:08:57.000Z","updated_at":"2025-03-25T18:41:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"5d33995a-f011-4637-8402-abc79ec8dd26","html_url":"https://github.com/Blankj/RxBus","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blankj%2FRxBus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blankj%2FRxBus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blankj%2FRxBus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Blankj%2FRxBus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Blankj","download_url":"https://codeload.github.com/Blankj/RxBus/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248054194,"owners_count":21039952,"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":["eventbus","rxandroid","rxandroid2","rxbus","rxbus2","rxjava","rxjava2"],"created_at":"2024-11-16T10:14:09.288Z","updated_at":"2025-04-09T14:09:36.115Z","avatar_url":"https://github.com/Blankj.png","language":"Java","readme":"![logo][logo]\n\n[![rb][rbsvg]][rb] [![License][licensesvg]][license]\n\n\n## Download\n\nGradle:\n```groovy\nimplementation \"com.blankj:rxbus:1.6\"\n```\n\n\n## How to use\n\n### 非粘性事件\n1. 注册事件\n  ```java\n  public class YourActivity extends Activity {\n      @Override\n      protected void onCreate(Bundle savedInstanceState) {\n          super.onCreate(savedInstanceState);\n          setContentView(R.layout.activity_main);\n\n          // 注册 String 类型事件\n          RxBus.getDefault().subscribe(this, new RxBus.Callback\u003cString\u003e() {\n              @Override\n              public void onEvent(String s) {\n                  Log.e(\"eventTag\", s);\n              }\n          });\n\n          // 注册带 tag 为 \"my tag\" 的 String 类型事件\n          RxBus.getDefault().subscribe(this, \"my tag\", new RxBus.Callback\u003cString\u003e() {\n              @Override\n              public void onEvent(String s) {\n                  Log.e(\"eventTag\", s);\n              }\n          });\n      }\n\n      @Override\n      protected void onDestroy() {\n          super.onDestroy();\n          // 注销\n          RxBus.getDefault().unregister(this);\n      }\n  }\n  ```\n2. 发送事件\n  ```java\n  // 发送 String 类型事件\n  RxBus.getDefault().post(\"without tag\");\n\n  // 发送带 tag 为 \"my tag\" 的 String 类型事件\n  RxBus.getDefault().post(\"with tag\", \"my tag\");\n  ```\n\n\n### 粘性事件（也就是先发送事件，在之后注册的时候便会收到之前发送的事件）\n1. 发送事件\n  ```java\n  // 发送 String 类型的粘性事件\n  RxBus.getDefault().postSticky(\"without tag\");\n\n  // 发送带 tag 为 \"my tag\" 的 String 类型的粘性事件\n  RxBus.getDefault().postSticky(\"with tag\", \"my tag\");\n\n  // 在需要移除粘性事件的地方移除它\n  RxBus.getDefault().removeSticky(\"without tag\");\n  RxBus.getDefault().removeSticky(\"with tag\", \"my tag\");\n  ```\n2. 注册事件\n  ```java\n  public class YourActivity extends Activity {\n      @Override\n      protected void onCreate(Bundle savedInstanceState) {\n          super.onCreate(savedInstanceState);\n          setContentView(R.layout.activity_main);\n\n          // 注册 String 类型事件\n          RxBus.getDefault().subscribeSticky(this, new RxBus.Callback\u003cString\u003e() {\n              @Override\n              public void onEvent(String s) {\n                  Log.e(\"eventTag\", s);\n              }\n          });\n\n          // 注册带 tag 为 \"my tag\" 的 String 类型事件\n          RxBus.getDefault().subscribeSticky(this, \"my tag\", new RxBus.Callback\u003cString\u003e() {\n              @Override\n              public void onEvent(String s) {\n                  Log.e(\"eventTag\", s);\n              }\n          });\n      }\n\n      @Override\n      protected void onDestroy() {\n          super.onDestroy();\n          // 注销\n          RxBus.getDefault().unregister(this);\n      }\n  }\n  ```\n\n\n## Nice wrap\n\n如果用到事件总线的地方比较多，那么可以把事件总线的使用放到一个 Manager 中使用，比如我 Demo 中做的封装如下所示：\n\n```java\npublic class RxBusManager {\n\n    private static final String MY_TAG = \"MY_TAG\";\n\n    public static void subscribeRxBusManagerActivity(final RxBusManagerActivity activity){\n        RxBus.getDefault().subscribe(activity, new RxBus.Callback\u003cString\u003e() {\n            @Override\n            public void onEvent(String s) {\n                activity.updateText(\"without \" + s);\n            }\n        });\n\n        RxBus.getDefault().subscribe(activity, MY_TAG, new RxBus.Callback\u003cString\u003e() {\n            @Override\n            public void onEvent(String s) {\n                activity.updateText(\"with \" + s);\n            }\n        });\n    }\n\n    public static void postToRxBusManagerActivity(final String event) {\n        RxBus.getDefault().post(event);\n    }\n\n    public static void postWithMyTagToRxBusManagerActivity(final String event) {\n        RxBus.getDefault().post(event, MY_TAG);\n    }\n\n    public static void postStickyToRxBusManagerActivity(final String event) {\n        RxBus.getDefault().postSticky(event);\n    }\n\n    public static void postStickyWithMyTagToRxBusManagerActivity(final String event) {\n        RxBus.getDefault().postSticky(event, MY_TAG);\n    }\n\n    public static void unregisterRxBusManagerActivity(final RxBusManagerActivity activity) {\n        RxBus.getDefault().unregister(activity);\n    }\n}\n```\n\n可以看出这是在 RxBusManagerActivity 中要使用 RxBus 的相关代码，这样可以更方便地管理应用中所有的事件总线，而不至于发了个事件都不清楚接收方在哪的尴尬。\n\n\n## How it comes\n\n网上现有 RxBus 存有的问题：\n\n1. 使用的 RxBus 大多停留在 RxJava1 版本\n2. RxBus 实现的粘性事件很多都是有问题的\n3. 如果事件抛了异常，之后便再也无法接收到的问题\n4. 同类型事件需自己再次封装 Bean 进行区别。\n\n介于以上问题，我还是亲自封装一个简洁的供大家使用，库已经依赖了 RxAndroid 和 RxJava，所以导入了该库的就不需要再额外导入那两库了。\n\n当然，如果通信频率比较高追求效率的话还是推荐使用 [EventBus](https://github.com/greenrobot/EventBus)。\n\n\n## Principle\n\n1. 利用 FlowableProcessor 既可以作为观察者又可以作为被观察者来实现事件总线\n2. 粘性事件原理就是发送的时候把事件存到一个 hash 表中，在注册的时候查询下 hash 表中是否存在符合的事件，有的话就消费掉即可\n3. 替换原有 LambdaSubscriber 来让抛了异常之后可以继续接收到后续事件\n4. 封装了 TagMessage 来区分不同类别的 tag\n5. 动态识别范型对象来省去传入 Type 类型\n\n还有一些细节就自己看源码去了解吧，总共有用的代码不超过 300 行哈。\n\n\n## [Change log](https://github.com/Blankj/RxBus/blob/master/CHANGELOG.md)\n\n\n## 打个小广告\n\n欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。\n\n\n\n[logo]: https://raw.githubusercontent.com/Blankj/RxBus/master/art/logo.png\n\n[rbsvg]: https://img.shields.io/badge/RxBus-v1.6-brightgreen.svg\n[rb]: https://github.com/Blankj/RxBus\n\n[licensesvg]: https://img.shields.io/badge/License-Apache--2.0-brightgreen.svg\n[license]: https://github.com/Blankj/RxBus/blob/master/LICENSE\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblankj%2Frxbus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblankj%2Frxbus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblankj%2Frxbus/lists"}