Retrofit RXjava 网络框架android 开发程序员

RxJava入门与提高-线程控制Scheduler篇(4)

2017-11-09  本文已影响39人  小玉1991

前言

Scheduler 的 API

在RxJava 中,Scheduler ——调度器,相当于线程控制器,RxJava 通过它来指定每一段代码应该运行在什么样的线程。
RxJava 已经内置了几个 Scheduler ,它们已经适合大多数的使用场景:

线程操作的知识

先看两个栗子:

栗子1
Observable.create(new Observable.OnSubscribe<String>() {
                   @Override
                   public void call(Subscriber<? super String> subscriber) {
                       Logger.v( "rx_call" , Thread.currentThread().getName()  );
 
                       subscriber.onNext( "dd");
                       subscriber.onCompleted();
                   }
               })
 
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
 
               .map(new Func1<String, String >() {
                   @Override
                   public String call(String s) {
                       Logger.v( "rx_map" , Thread.currentThread().getName()  );
                       return s + "88";
                   }
               })
               .subscribe(new Action1<String>() {
                   @Override
                   public void call(String s) {
                       Logger.v( "rx_subscribe" , Thread.currentThread().getName()  );
                   }
               }) ;
结果
/rx_call: RxCachedThreadScheduler-1    --io线程
/rx_map: main                                     --主线程
/rx_subscribe: main                              --主线程

 栗子2
Observable.create(new Observable.OnSubscribe<String>() {
                   @Override
                   public void call(Subscriber<? super String> subscriber) {
                       Logger.v( "rx_call" , Thread.currentThread().getName()  );
 
                       subscriber.onNext( "dd");
                       subscriber.onCompleted();
                   }
               })
               .map(new Func1<String, String >() {
                   @Override
                   public String call(String s) {
                       Logger.v( "rx_map" , Thread.currentThread().getName()  );
                       return s + "88";
                   }
               })
 
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
 
               .subscribe(new Action1<String>() {
                   @Override
                   public void call(String s) {
                       Logger.v( "rx_subscribe" , Thread.currentThread().getName()  );
                   }
               }) ; 
结果
/rx_call: RxCachedThreadScheduler-1     --io线程
/rx_map: RxCachedThreadScheduler-1   --io线程
/rx_subscribe: main                 --主线程

分析上面两个栗子,结论

事件产生:默认运行在当前线程,可以由 subscribeOn() 自定义线程
事件加工:默认跟事件产生的线程保持一致, 可以由 observeOn() 自定义线程
事件消费:默认运行在当前线程,可以有observeOn() 自定义

结论

subscribeOn

image.png

查看log,这里,模块3执行,它后边没有设置线程,是main。
模块2执行,它后边设置了IO线程,所以领打印“doOnSubscribe1:RxIoScheduler-2”
模块1执行,也就是创建create方法执行,它后边有两个subscribeOn(),只有离他最近 的才会起作用。

image.png

observeOn

结论:observeOn作用于该操作符之后操作符直到出现新的observeOn操作符

image.png image.png

图片解释:
图中有两个observeOn()方法,竖向的箭头方向可以认为是Rxjava内部变化方向,横向的箭头可以认为是程序执行方向,颜色可以认为是不同的线程。
由图可以看出,每次竖直方向经过observeOn(),程序的执行颜色都会变化为observeOn()设定的颜色,直到再次执行observeOn()方法。
也就是 observeOn作用于该操作符之后操作符直到出现新的observeOn操作符

本文对应源码不做分析,只是讲述结论性的知识。


欢迎继续收看:RxJava入门与提高-网络Retrofit 篇(5)
作者:ZhangYushui
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇 下一篇

猜你喜欢

热点阅读