Skip to content

Rac EventBus RxJava

Rac 是什么

Rac 全称 Reactivecocoa,是一个应用于 iOSOS X 开发的框架,它的灵感来自函数式 响应式编程。

Rac 做了什么

将原有的各种设计模式,包括 中心以及观察者模式各种『输入』,都抽象成了信号,通过信号的传递来处理这些行为。简化了事件的传递,每个部分只需要关注信号的传递及状态即可。最终将信号通过不同的组合,达成我们最终的目的。

Rac 的组成

1. 核心组件

  • 信号源

    RACStream 及其子类;

  • 订阅者

    RACSubscriber及其子类

  • 调度器

    RACScheduler及其子类

  • 清洁工

    RACDisposable及其子类

2. 组件间的关系

  1. 订阅者订阅信号源后,调度器保证信号源的传递及顺序
  2. 信号到达后,根据信号的状态,进行不同的操作
  3. 操作完成后,通过清洁工清理掉信号源

Rac 的用处

  • 处理异步或者事件驱动数据源
  • 连接依赖的操作
  • 并行地独立地工作
  • 简化集合转换

Rac 的使用

Rac 的简单使用

对比 EventBus RxJava

EventBus

EventBus 是一款针对 Android 设计的发布/订阅事件总线,使用订阅/发布模式让组件间的通信变得简单。主要功能是替代 Intent,Handler,BroadCast 在 Fragment,Activity,Service,线程之间的消息传递。

  • EventBus 四大组成部分:1. Publisher 发布者 用于分发我们的 Event 事件,在 EventBus 中通过 post 方法进行分发传送。2. Subscriber 订阅者 用于接受我们的事件,我们在订阅事件中处理我们接收的数据。3. Event 事件 任何一个对象都可以作为事件,比如任何字符串,事件是发布者和订阅者之间的通信载体。4. EventBus 类似于中转站,将我们的事件进行对应的分发处理。

  • 优点 1. 简化了组件之间的通信

    • 将事件发送者和接收者分离
    • ActivitiesFragmentsbackground threads中表现良好
    • 避免复杂且容易出错的依赖关系和生命周期问题
      1. 使代码更简单
      2. 性能开销小
      3. 代码量小(约 50k 左右)
  • 缺点 消息乱飞?不方便 Debug?

  • 使用 1. 定义一个事件

    java
    public static class MessageEvent
    {
        /* Additional fields if needed */
    }
    1. 声明一个用于响应的方法,并且在适当的生命周期注册或注销

      java
      @Subscribe(threadMode = ThreadMode.MAIN)
      public void onMessageEvent(MessageEvent event)
      {
          /* Do something */
      }
      @Override
      public void onStart() {
          super.onStart();
          <!--
              官方写法,但是如果不进行处理,可能会造成重复注册订阅,多次响应事件
              EventBus.getDefault().register(this);
          -->
          // 通过 isRegistered 检查是否已经注册订阅
          if (!EventBus.getDefault().isRegistered(this)) {
              EventBus.getDefault().register(this);
          }
      }
      
      @Override
      public void onStop() {
          super.onStop();
          EventBus.getDefault().unregister(this);
      }
    2. 根据不同的应用场景,可以选择在不同的声明周期注册或移除订阅

      java
      @Override
      protected void onCreate(Bundle savedInstanceState)
      {
          super.onCreate(savedInstanceState);
      }
      @Override
      protected void onDestroy()
      {
          super.onDestroy();
      }
      
      @Override
      protected void onResume()
      {
          super.onResume();
      }
      @Override
      protected void onPause()
      {
          super.onPause();
      }
    3. 发布事件,事件发布后,订阅者中的响应方法就会受到事件

      java
      EventBus.getDefault().post(new MessageEvent());

RxJava

RxJavaGitHub 主页上的自我介绍是"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库),核心可以总结为两个字:异步。说到根上,它就是一个实现异步操作的库。而它的异步实现,是通过一种扩展的观察者模式来实现的。

  • RxJava 的四个基本概念 1. Observable (可观察者,即被观察者) 决定什么时候触发事件以及触发怎样的事件。2. Observer (观察者) 决定事件触发的时候将有怎样的行为。3. subscribe (订阅) 创建了 ObservableObserver 之后,再用 subscribe() 方法将它们联结起来,整条链子就可以工作了 4. 事件

  • 使用

    java
    Observable.from(folders)
        <!-- 降维,事件转换? -->
        .flatMap(new Func1<File, Observable<File>>() {
            @Override
            public Observable<File> call(File file) {
                return Observable.from(file.listFiles());
            }
        })
        <!-- 事件过滤 -->
        .filter(new Func1<File, Boolean>() {
            @Override
            public Boolean call(File file) {
                return file.getName().endsWith(".png");
            }
        })
        <!-- 类型转换? -->
        .map(new Func1<File, Bitmap>() {
            @Override
            public Bitmap call(File file) {
                return getBitmapFromFile(file);
            }
        })
        <!-- 指定 Observable 自身在哪个调度器上执行 -->
        .subscribeOn(Schedulers.io())
        <!-- 指定一个观察者在哪个调度器上观察这个 Observable -->
        .observeOn(AndroidSchedulers.mainThread())
        <!-- 事件响应? -->
        .subscribe(new Action1<Bitmap>() {
            @Override
            public void call(Bitmap bitmap) {
                imageCollectorView.addImage(bitmap);
            }
        });

参考资料

  1. Reactivecocoa

  2. ReactiveCocoa 常用 API 整理

  3. EventBus

  4. EventBus 中文文档

  5. 给 Android 开发者的 RxJava 详解

  6. RxJava 的使用