android 从Rxjava2.0到Retrofit (一)

前言:遗憾的我现在才发现这2个框架惊人之处.现在学学还不算完,但Rxjava真的很难入手,不想okhttp,Retrofit那样看下就可以使用,所以学习Rxjava还需要一段蛮长时间.


Rxjava从1.x到2.x,方法和类都有很多改变,但是功能还是那个样,刚刚学习有太多的不解.对于1.x的,,我也没用过,直接从2.x开始撸起,

Rxjava是什么呢?可以理解为异步的框架. 类似于 AsyncTask. 但其灵活性和扩展性远远强于前者


主要包过这几个接口:

Publisher 
Subscriber 
Subscription 
Processor 
Flowable与Observable


publisher和processor我还没用过,后面将去使用再更新.

subsrcipiton,Flowable,observable,observer,subscriber则是重点.

Subscriber 和 Observer的接口是分别独立的,Obsesrver用于订阅Observable,而Subscriber用于订阅Flowable


Rxjava可以理解为观察者模式,观察者模式不知道什么?最好的理解就是我们Android中Button的点击事0件:


观察者(OnClickListener接口),被观察者(Buttion的底层触摸事件),订阅(setOnClickListener()方法)

对应

观察者(Observable或Flowable),被观察者(Observer或Subscriber),订阅(subscribe()方法)


接下来我们看一个例子:



//创建一个被观察者
Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> e) throws Exception {
	//触发被观察者的一个事件
        System.out.println("2,subscribe");
        e.onNext("observable");
        e.onComplete();
    }
});
//订阅被观察者的行为事件
observable.subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d)
    {
        System.out.println("1,当订阅事件后首先执行的是onSubscribe--");

    }

    @Override
    public void onNext(String value) {
        System.out.println("4,onNext--");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError--");
    }

    @Override
    public void onComplete() {
        System.out.println("5,onComplete--");
    }
});
Observable作为一个被观察者,并绑定了被观察者的一个触发行为时间,比如小偷是Observable,警察是Observer,,警察不能无缘无端的抓小偷吧,必须要有证据才能去抓,这个证据的
触发方法就是这里的ObservableOnSubscribe接口的subscribe()方法,很好理解.
subscribe()方法中有回调参数ObservableEmitter<String> e,这个对象正是下面观察者中的方法onNext,onError,Oncomplete的操作对象,调用e.onNext(),e.complete()即可触发这些
行为,在网路请求数据的时候很好的操作这些网络数据.很灵活.
注意Observer中的onSubscribe方法下的dispoable 对象可以拦截接下来的操作,调用d.dispose()即可;
最后是订阅这个观察者,observable.subscribe(观察者),这次流程就已经完成.

案例打印出来的正是:

1,当订阅事件后首先执行的是onSubscribe--
2,subscribe
4,onNext--
5,onComplete--

看着顺序是不是觉的有点疑惑?

按我们思维肯定是:

2,subscribe
4,onNext--
5,onComplete--

这个需要大伙们去探查Rxjava源码了,反正这不重要,知道流程就可以起飞了.


数据转换


Rxjava潮热,少不了,这一点.看下例子:


Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> e) throws Exception {
        System.out.println("2,subscribe");
        e.onNext("observable");
        e.onComplete();
    }
}).map(new Function<String, String>() {
    @Override
    public String apply(String s) throws Exception {
        System.out.println("3,数据处理apply--");
        return s;
    }
});

observable.subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d)
    {d.dispose();
        System.out.println("1,当订阅事件后首先执行的是onSubscribe--");

    }

    @Override
    public void onNext(String value) {
        System.out.println("4,onNext--");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError--");
    }

    @Override
    public void onComplete() {
        System.out.println("5,onComplete--");
    }
});
map操作符的使用,以网络请求数据为例,在subscribe()方法中获取数据后,我们想对数据进行一个转换,这时候使用map是最好的了,

看下打印结果就明白:

1,当订阅事件后首先执行的是onSubscribe--
2,subscribe
3,数据处理apply--
4,onNext--
5,onComplete--


Rxjava还有很多这种操作符:

Combining Obsercables(Observable的组合操作符)

操作符         功能
combineLatest 两个Observable产生的结果合并成新Observable,任意Observable产生的结果和另一个Observable最后产生的结果按规则合并
join like combineLatest 能控制每个Observable产生结果的生命周期,在每个结果的生命周期内,与另一个Observable产生的结果按规则合并
groupJoin like join 暂不知其他区别
==merge== ==按照两个Observable的提交结果的时间顺序,对Observable合并。时间按某Observable完成的最小时间==
mergeDelayError 合并的某一个Observable中出现错误,把错误放到所有结果都合并完成之后,订阅者回调执行onError。而merge会马上停止合并
startWith 源Observable提交结果之前,插入指定数据
switchOnNext 把一组Observable转换成Observable。这组Observable中取最后一个Observable提交的结果给订阅者。
==zip== ==把两个Observable提交的结果按照顺序进行合并。==

Error Handing Operators(Observable的错误处理操作符)

操作符    功能
onErrorReturn    在Observable 发生错误或异常(即将回调onError)时,拦截错误并执行指定的逻辑,返回一个跟源Observable相同类型的结果,最后回调订阅者的onComplete方法
onErrorResumeNext like onErrorReturn 不同的是返回一个Observable 例:return Observable.just(5,2,0);
onExceptionResumeNext like onErrorResumeNext 不同的是只有在exception的时候触发
==retry== ==当Observable发生错误或异常,重新执行Observable的逻辑,如果经过n次重新执行后仍然出现错误或异常,则最后回调onError方法,若无错误或异常则按正常流程执行 例:observable.retry(2).subscribe();==
retryWhen like retry 不同在于retryWhen是在源Observable出现错误或异常时,通过回调第二个Observable来判断是否重新尝试执行源Observable的逻辑;若第二个Observable没错误或异常,则会重新尝试执行源Observable的逻辑,否则就会直接回调执行订阅者的onError();

其他常用

操作符 功能
map 对源Observable数据的加工处理,返回其他类型 例:return 520+”string data”;
flatMap like map 不同的是返回一个Observable 扩展:使用了merge操作符 例:return Observable.from(…);
concatMap like concatMap 不同的是concatMap操作遵循元素的顺序 扩展:使用了concat操作符
compose 唯一一个能从流中获取原生Observable的方法,因此,影响整个流的操作符(subscribeOn()和observeOn())需要用compose()。当你创建一个Observable流并且内联了一堆操作符以后,compose()会立即执行,所以compose转换的是整个流
compose与flagMap的区别 flatMap()一定是低效率的,因为他每次调用onNext()之后都需要创建一个新的Observable,compose()是操作在整个流上的
concat 按顺序依次连接两个或更多的 Observable
first 从序列中取第一个先完成的项
takeFirst like first 区别是first()如果没有释放有效的数据源,那么会throw NoSuchElementException;而takeFirst会complete没有 exception




线程控制


在Rxjava中可以控制观察者和被观察者的线程执行,subscribeOn()和 observeOn(),所以可以利用在被观察者中subscribe()在子线程去获取网络数据,再切换观察者在主线程更新UI,是不是很有逻辑性.

介绍线程切换的主要参数:

Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。 

Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。

Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 new Thread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比new Thread()更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。 

 Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在computation()中,否则 I/O 操作的等待时间会浪费 CPU。 

AndroidSchedulers.mainThread():主线程



今天就介绍到这里......

下一章讲解与Retrofit的结合

贴上几个有助于理解的博客:

http://www.tuicool.com/articles/Jr2AJvN



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章