当前位置: 代码迷 >> 综合 >> Android-使用 RxJava2 封装 RxBus
  详细解决方案

Android-使用 RxJava2 封装 RxBus

热度:12   发布时间:2024-02-24 20:03:57.0

实现

内容来源网络,链接忘记了,侵权删。

object RxBus {
    private val TAG = javaClass.simpleName/*** 用于保存RxBus事件的所有订阅,并在需要时正确的取消订阅。*/private val disposablesMap: HashMap<Any, CompositeDisposable?> by lazy {
    HashMap<Any, CompositeDisposable?>()}/*** 避免直接使用此属性,因为它仅在内联函数中使用而暴露* PublishSubject:接收到订阅之后的所有数据* ReplaySubject:接收到所有的数据,包括订阅之前的所有数据和订阅之后的所有数据。* BehaviorSubject:接收到订阅前的最后一条数据和订阅后的所有数据。* AsyncSubject:不管在什么位置订阅,都只接收到最后一条数据*/val rxBus = PublishSubject.create<Any>().toSerialized()/*** 向RxBus发送一个事件,这个事件可以来自任意一个线程*/fun send(event: Any) {
    rxBus.onNext(event)}/*** 订阅特定类型T的事件。可以从任何线程调用*/inline fun <reified T : Any> observe(): Observable<T> {
    return rxBus.ofType(T::class.java)}/*** 从RxBus事件中取消注册订阅者* 调用订阅的取消订阅方法*/fun unRegister(disposable: Any) {
    val compositeDisposable = disposablesMap[disposable]if (compositeDisposable == null) {
    Log.e(TAG, "compositeDisposable == null")} else {
    compositeDisposable.clear()disposablesMap.remove(disposable)}}/*** internal修饰符 只有在相同模块中才能使用*/internal fun register(disposable: Any, composite: Disposable) {
    var compositeDisposable = disposablesMap[disposable]if (compositeDisposable == null) {
    compositeDisposable = CompositeDisposable()}compositeDisposable.add(composite)disposablesMap[disposable] = compositeDisposable}
}/*** 注册订阅以便以后正确注销它以避免内存泄漏* @param disposable 拥有此订阅的订阅对象*/
fun Disposable.registerInBus(disposable: Any) {
    RxBus.register(disposable, this)
}使用:
1. 注册,在 onCreate 方法
RxBus.observe<String>().subscribe {
     t: String? ->Log.e(TAG,"接收的数据:$t")}.registerInBus(this)2. 发送
RxBus.send("123")3. 注销,在 onDestory 方法
RxBus.unRegister(this)
  相关解决方案