Rx系列andnroid

RxJava学习系列(一)--使用

2016-06-29  本文已影响1258人  黑丫山上小旋风

注:本系列文章主要用于博主个人学习记录,本文末尾附上了一些较好的文章提供学习。
转载请附 原文链接
RxJava学习系列(一)--使用
RxJava学习系列(二)--原理

RxJava利用响应式编程思想,专注于异步任务的处理,通过操作符进行流式操作,可以极大的去除多层嵌套,达到逻辑的简洁明了。

举个栗子🌰


模拟用户注册请求

RxJava的观察者模式与普通观察者模式有一个区别是分为“冷”启动和“热”启动,“热”启动即不管有没有观察者,观察者会按照自己的逻辑发送数据,而“冷”启动则是只有当观察者开启订阅时才开始发送数据。

1.基本概念及用法

一次完整订阅

2.线程控制

上面所提到的订阅会默认在当前线程中执行,然并卵,既然是专注于异步操作,就一定有线程控制的方法

如上图,首先指定了subscribeOn的线程为io线程,然后又指定了计算线程,打印日志


logcat 1

通过日志打印可以发现,只有第一个subscribeOn生效,并且在observeOn之前的代码也都在io线程中执行,而在observeOn之后的代码,在每一次调用该方法后都改变了线程

有好事的同学说了,那如果我先调用observeOn再调用subscribeOn呢?虽然没有人这么做,但严谨的我还是要试试


observeOn

先调用observeOn指定为主线程,然后subscribeOn指定为ui线程


E1EB67D4-11D4-42D2-A26F-5AB4282263A1.jpg

可以看到第一条日志在io线程中执行,而第二条日志在主线程中,似乎可以得到一个结论

observeOn指定在它之后的代码的执行线程,而其余代码均在第一个subscribeOn指定的线程中执行

3.操作符

A.转换操作

注意:只有每一个Observable都成功发射数据后,才会调用onNext方法,如果出现异常会直接调用onError

这样看来,好像很鸡肋,后面会讲到错误操作,你会发现RxJava确实是很牛逼的啊~

B.合并操作

C.过滤操作

假设这样一种场景,加载数据的时候先向服务器请求,如果成功就显示,如果失败就查找缓存数据。很容易想到可以利用合并操作符来处理,但是合并操作会依次发射数据,这不是我们所希望的。这里就需要用的过滤操作了

D.异常处理

异常处理

onErrorReturn可以在异常发生时发射一个默认的数据,结合过滤操作,可以发射一个不符合规则的数据,避免中断数据发射

E.doOn

有一种场景,比如说请求到数据后写入缓存,但是不希望订阅者去处理,因为如果多处订阅必然会产生重复代码并且可能阻塞主线程,doOn的系列操作就派上了用场

F.封装-compose

当我们真正开始使用RxJava来替换之前的逻辑代码时,我们发现仅用现有的操作符无法做到完全的简洁,依然会出现一些不必要的重复代码和逻辑。适度的封装也是必要的,RxJava早就想到了这点,提供了一个操作符来封装一些通用代码

4.RxBus

EventBus让模块间的耦合更低,利用 RxJava实现EventBus简直是容易,且便于管理

在实现RxBus之前介绍两个很重要的类

再贴代码

private ConcurrentHashMap<Object, List<Subject>> subjectMapper 
  = new ConcurrentHashMap<Object, List<Subject>>();
//订阅事件
public <T> Observable<T> subscribe(@NonNull Object tag) {
        List<Subject> subjectList = subjectMapper.get(tag);
        if (null == subjectList) {
            subjectList = new ArrayList<Subject>();
            subjectMapper.put(tag, subjectList);
        }
        Subject<T, T> subject;
        subjectList.add(subject = PublishSubject.create());
        return subject;
    }
//发布事件--发射数据
public void post(@NonNull Object tag, @NonNull Object content) {
        List<Subject> subjectList = subjectMapper.get(tag);
        if (!isEmpty(subjectList)) {
            for (Subject subject : subjectList) {
                subject.onNext(content);
            }
        }
    }

RxBus的核心逻辑就完成了,当然还需要加上取消订阅,清空事件等代码,比较简单不再赘述,在我实际的项目开发中,我将 RxBus交由 RxJavaManager进行管理,所有的订阅事件全部经过 RxJavaManager来操作,在需要取消订阅的地方统一unsubscribe

5.资料

上一篇下一篇

猜你喜欢

热点阅读