zoukankan      html  css  js  c++  java
  • Android-RxBus相关概念总结

    RxBus 是什么?

    这里有一连串的概念 - -!

    RxBusRxJava的自定义实现;

    RxJava?它是ReactiveX在java上的实现。

    ReactiveX?专注于异步编程和控制可观察数据和事件流的API,它组合了观察者模式,迭代器模式,函数式编程的优秀思想)

    所以说,RxBus:是java上用于 异步编程,控制可观察数据和事件流的API。

    在android架构上,RxBus用来 实现 组件之间的无差别信息互通。

    组件

    四大组件。Activity,Service,ContentProvider,BroadcastReceiver,讲道理,除了Activity的3个组件,都用的很少,因为业务场景并没涉及。

    以及小概念上的组件,比如自定义的View,ViewGroup,Fragment;

    无差别

    所谓无差别,就是所有组件在信息互通上都是平等地位,任何一个组件都可以发送消息,和接收消息。并且这种方式并没有对android原有的信息传递方式(Intent+Bundle)造成影响,原有的依然可以用。

    依赖的库:

    目前,RxJava有2个大版本,1.X和2.X ;两者的区别,1.X的 核心类 是Observable,2.X则换成了Flowable,API和调用方式有所改变,功能也有所不同。
    Github上有版本迭代的记录,到github上,搜索RxJava,第一个就是。

     

     

    最新版本目前是2.2.2.

    ===========================
    RxBus使用方法:

    假如你已经有了一个RxBus.java(事件总线类,或者消息总线类)

    那么它的业务模型,应该是:

    组件A和B要互通消息,A 要发消息给B,那么,B要收到消息,必须 在事件总线上“订阅”,成为订阅者。A调用RxBus的API,由事件总线发出消息,然后 让订阅者收到, B收到消息之后自行处理。


    网上搜罗了一些RxBus使用上的一些梗:

    1-Sticky 粘性。

    和粘性对应的是 “非粘性”:即, B要想收到消息,“必须”在A发出消息之前,到事件总线去“订阅”,然后A发消息,B收到之后处理。 那么粘性: B"无须"在A发出消息之前订阅,即使消息已发出,你才去订阅,也能收到。

    在最新版本的RxJava的第三方API中,貌似提供了4种粘性消息的实现类,可自行度娘;各种API。

    2-消息类别区分:

    上面的案例只是说,A发送消息给B,但是如果同时有B1,B2,B3,B4....B100呢?这么多组件,那如果我需要对消息进行区分,明确我要把消息发给谁,应该怎么做。可是,RxJava上我没发现直接解决这种问题的API···所以,自己解决吧。

    具体方法:

    A调用RxBus的接口,接口参数是一个Object对象,本来这个对象是直接发给B的,那么现在如果把这个对象封装一下,把原本的对象变成一个成员变量,再增加一个String code,作为消息类别的标识符。

    B在 订阅消息的时候,也要对消息进行过滤,只接收对应code的消息。(这里过滤消息,用的是第三方库的API。。filter,好吧,这个库还有很大进步空间啊)

    3-反压力 Backpressure:

    反压力这个概念 来源于 生产者消费者的模型:当生产者的生产效率高于消费者的消费效率,消费者无法及时处理,就会造成产品积压。

    同样,在消息总线中,如果积压了太多消息,一窝蜂发给 订阅者,如果订阅者来不及处理,可能就会造成预期之外的效果,长期如此就会耗费内存。

    针对这种问题。。。

    查了资料,有一篇好文( https://www.jianshu.com/p/2c4799fa91a4 ),明确定义:背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略;背压是流速控制的一种策略;

    策略细节

    1) 响应式拉取。原本:观察者是被动接收事件,被观察者是主动发送数据。那么现在变成:观察者主动拉取数据,被观察者得知观察者需要数据之后,再发送数据,由观察者掌握主动权。

    2) 热 被观察者,冷被观察者(Hot/cold observables);

    `````

    背压这个东西,暂时用不到,而且牵涉的其他知识太多了,遇到了再说吧.

    总结就到这里。我要查别的东西了·····

    Demo

    总结了一个Demo放在了github上,实现了 消息总线的基本功能,并且 对消息进行了区分对待;三块不同的颜色区域是 3个独立的Fragment组件;

    说明-

    1-  业务1的消息发送

    2-  业务2的消息发送

    3-  订阅业务1的消息

    4-  取消业务1的消息订阅

    5-  订阅业务2的消息

    6-  取消业务2的消息订阅

    7-  显示业务1的消息内容

    8-  显示业务2的消息内容

    这是动态图;

    最后奉上我自己的 Demo-Github地址:https://github.com/18598925736/RxBusStudy2

  • 相关阅读:
    深度解析VC中的消息传递机制(上)
    DLL的远程注入技术
    一些游戏编程的书[转]
    [转]小小C的C++之歌
    Windows Server 2008无法使用arp命令添加静态MAC绑定
    如何调用未公开的API函数[转]
    IOCP中的socket错误和资源释放处理方法
    TinyXML应用例子
    微软C/C++ 编译器选项参考
    [摘录]这几本游戏编程书籍你看过吗?
  • 原文地址:https://www.cnblogs.com/hankzhouAndroid/p/9686549.html
Copyright © 2011-2022 走看看