zoukankan      html  css  js  c++  java
  • Rxbus的使用

    Rxbus是一种模式,在RxJava中

    一、添加依赖

    1 compile 'io.reactivex:rxandroid:1.2.0'
    2 compile 'io.reactivex:rxjava:1.1.5'

    二、包装 --- 创建类

     1 public class RxBus {
     2     private static volatile RxBus sRxBus;
     3     // 主题
     4     private final Subject<Object, Object> mBus;
     5 
     6     // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
     7     public RxBus() {
     8         mBus = new SerializedSubject<>(PublishSubject.create());
     9     }
    10 
    11     // 单例RxBus
    12     public static RxBus getInstance() {
    13         if (sRxBus == null) {
    14             synchronized (RxBus.class) {
    15                 if (sRxBus == null) {
    16                     sRxBus = new RxBus();
    17                 }
    18             }
    19         }
    20         return sRxBus;
    21     }
    22 
    23     // 提供了一个新的事件
    24     public void post(Object o) {
    25         mBus.onNext(o);
    26     }
    27 
    28     // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
    29     public <T> Observable<T> toObservable(Class<T> eventType) {
    30         return mBus.ofType(eventType);
    31 //        ofType = filter + cast
    32 //        return mBus.filter(new Func1<Object, Boolean>() {
    33 //            @Override
    34 //            public Boolean call(Object o) {
    35 //                return eventType.isInstance(o);
    36 //            }
    37 //        }) .cast(eventType);
    38     }
    39 }

    说明:

    1、Subject同时充当了Observer和Observable的角色,Subject是非线程安全的,要避免该问题,需要将 Subject转换为一个 SerializedSubject,上述RxBus类中把线程非安全的PublishSubject包装成线程安全的Subject。
    2、PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。
    3、ofType操作符只发射指定类型的数据,其内部就是filter+cast

    三、创建发送的事件类

      发送 toObservable(Class<T> eventType)  事件.class

     1 public class ChannelItemMoveEvent {
     2     private int fromPosition;
     3     private int toPosition;
     4 
     5     public int getFromPosition() {
     6         return fromPosition;
     7     }
     8 
     9     public int getToPosition() {
    10         return toPosition;
    11     }
    12 
    13     public ChannelItemMoveEvent(int fromPosition, int toPosition) {
    14         this.fromPosition = fromPosition;
    15         this.toPosition = toPosition;
    16 
    17     }
    18 }

    四、发送事件

    1 RxBus.getInstance().post(new ChannelItemMoveEvent(fromPosition, toPosition));

    五、接收事件

    1 mSubscription = RxBus.getInstance().toObservable(ChannelItemMoveEvent.class)
    2                 .subscribe(new Action1<ChannelItemMoveEvent>() {
    3                     @Override
    4                     public void call(ChannelItemMoveEvent channelItemMoveEvent) {
    5                         int fromPosition = channelItemMoveEvent.getFromPosition();
    6                         int toPosition = channelItemMoveEvent.getToPosition();7                     }
    8                 });

    六、取消订阅

    一般会在基类有一个成员变量 mSubscription,并在OnDestroy的时机取消订阅。

    1  @Override
    2     protected void onDestroy() {
    3         if (mSubscription!= null && !mSubscription.isUnsubscribed()) {
    4             mSubscription.unsubscribe();
    5         }
    6     }
  • 相关阅读:
    用 HTML 格式导出 Excel 时,如何保留显示网格线
    [转载] 让SciTE能够和IDE一样进行成员提示
    RedHat 上安装多个 mysql 实例并配置 django 连接的操作记录
    我的 SciTEGlobal.properties 配置文件
    FrameSet 不能支持透明
    RedHat 上安装 lighttpd 并配置 fastcgi + django 的记录
    系统设计与开发 辅助工具大集成终结版
    SQL Server Management Object(SMO)大大简化数据库工具的开发 几行代码开发功能强大的SQL工具
    Enterprise Solution 解决方案与源代码下载
    LLBL Gen 实体映射工具技术原理剖析
  • 原文地址:https://www.cnblogs.com/aimqqroad-13/p/7112460.html
Copyright © 2011-2022 走看看