Android RxJava的线程控制 —— Scheduler
2016-06-08 02:34
525 查看
Scheduler-调度器
If you want to introduce multithreading into your cascade of Observable operators, you can do so by instructing those operators (or particular Observables) to operate on particular Schedulers.
如果你想给你的操作符链添加多线程,你可以通知这些操作符(或特定的Observables)运行在指定的调度器上.
也就是说RxJava的多线程是由Schedulers操作的,接下去去了解一下.
调度器种类
RxJava中Schedulers有很多种
下表展示了RxJava中可用的调度器种类(RxAndroid中有多少暂时不知道):
下面介绍两个操作符.
SubscribeOn
specify the Scheduler on which an Observable will operate
SubscribeOn 指定了Observable的调度器.
ObserveOn
specify the Scheduler on which an observer will observe this Observable
指定observer将会在哪个Scheduler观察这个Observable.
更具体的说ObserveOn指示一个Observable在一个特定的调度器上调用观察者的onNext, onError和onCompleted方法,
即影响的是subscribe()里的操作.
简单来讲:
使用RxJava,你可以使用subscribeOn()指定被观察者代码运行的线程,使用observerOn()指定订阅者运行的线程:
可能还是不太看得懂,
来,show me the code:
–出自这里
RxJava是同步的~~~
观察者模式本身的目的不就是后台处理,将处理结果回调给前台?这同步的是要哪样?所以,了解Scheduler很重要。
介绍
RxJava在不指定线程的情况下,发起时间和消费时间默认使用当前线程。所以之前的做法
因为是在主线程中发起的,所以不管中间map的处理还是Action1的执行都是在主线程中进行的。若是map中有耗时的操作,这样会导致主线程拥塞,这并不是我们想看到的。
模拟一个需求:新的线程发起事件,在主线程中消费
上面用到了subscribeOn(),和observeOn()方法来指定发生的线程和消费的线程。
subscribeOn():指定subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
observeOn():指定Subscriber 所运行在的线程。或者叫做事件消费的线程。
可以看到observeOn()被调用了两次,分别指定了map的处理的现场和消费事件show(s)的线程。
若将observeOn(AndroidSchedulers.mainThread())去掉会怎么样?不为消费事件show(s)指定线程后,show(s)会在那里执行?
其实,observeOn() 指定的是它之后的操作所在的线程。也就是说,map的处理和最后的消费事件show(s)都会在io线程中执行。
observeOn()可以多次使用,可以随意变换线程
小结
学会线程控制后才算是真正学会了使用RxJava。RxJava的使用十分灵活,想要对其熟悉使用只有一个办法,那就是多用啦,熟能生巧。
转自:http://www.jianshu.com/p/ecfb9d68d2a2
If you want to introduce multithreading into your cascade of Observable operators, you can do so by instructing those operators (or particular Observables) to operate on particular Schedulers.
如果你想给你的操作符链添加多线程,你可以通知这些操作符(或特定的Observables)运行在指定的调度器上.
也就是说RxJava的多线程是由Schedulers操作的,接下去去了解一下.
调度器种类
RxJava中Schedulers有很多种
下表展示了RxJava中可用的调度器种类(RxAndroid中有多少暂时不知道):
下面介绍两个操作符.
SubscribeOn
specify the Scheduler on which an Observable will operate
SubscribeOn 指定了Observable的调度器.
ObserveOn
specify the Scheduler on which an observer will observe this Observable
指定observer将会在哪个Scheduler观察这个Observable.
更具体的说ObserveOn指示一个Observable在一个特定的调度器上调用观察者的onNext, onError和onCompleted方法,
即影响的是subscribe()里的操作.
简单来讲:
使用RxJava,你可以使用subscribeOn()指定被观察者代码运行的线程,使用observerOn()指定订阅者运行的线程:
可能还是不太看得懂,
来,show me the code:
–出自这里
RxJava是同步的~~~
观察者模式本身的目的不就是后台处理,将处理结果回调给前台?这同步的是要哪样?所以,了解Scheduler很重要。
介绍
RxJava在不指定线程的情况下,发起时间和消费时间默认使用当前线程。所以之前的做法
Observable.just(student1, student2, student2) //使用map进行转换,参数1:转换前的类型,参数2:转换后的类型 .map(new Func1<Student, String>() { @Override public String call(Student i) { String name = i.getName();//获取Student对象中的name return name;//返回name } }) .subscribe(new Action1<String>() { @Override public void call(String s) { nameList.add(s); } });
因为是在主线程中发起的,所以不管中间map的处理还是Action1的执行都是在主线程中进行的。若是map中有耗时的操作,这样会导致主线程拥塞,这并不是我们想看到的。
Scheduler
Scheduler:线程控制器,可以指定每一段代码在什么样的线程中执行。模拟一个需求:新的线程发起事件,在主线程中消费
Observable.just("Hello", "Word") .subscribeOn(Schedulers.newThread())//指定 subscribe() 发生在新的线程 .observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回调发生在主线程 .subscribe(new Action1<String>() { @Override public void call(String s) { Log.i(TAG, s); } });
上面用到了subscribeOn(),和observeOn()方法来指定发生的线程和消费的线程。
subscribeOn():指定subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。
observeOn():指定Subscriber 所运行在的线程。或者叫做事件消费的线程。
多次切换线程
看完上面的介绍想必对RxJava线程的切换有了一些理解,上面只是对事件的发起和消费制定了线程。如果中间有map之类的操作呢?是否可以实现发起的线程在新线程中,map的处理在IO线程,最后的消费在主线程中。Observable.just("Hello", "Wrold") .subscribeOn(Schedulers.newThread())//指定:在新的线程中发起 .observeOn(Schedulers.io()) //指定:在io线程中处理 .map(new Func1<String, String>() { @Override public String call(String s) { return handleString(s); //处理数据 } }) .observeOn(AndroidSchedulers.mainThread())//指定:在主线程中处理 .subscribe(new Action1<String>() { @Override public void call(String s) { show(s); //消费事件 } });
可以看到observeOn()被调用了两次,分别指定了map的处理的现场和消费事件show(s)的线程。
若将observeOn(AndroidSchedulers.mainThread())去掉会怎么样?不为消费事件show(s)指定线程后,show(s)会在那里执行?
其实,observeOn() 指定的是它之后的操作所在的线程。也就是说,map的处理和最后的消费事件show(s)都会在io线程中执行。
observeOn()可以多次使用,可以随意变换线程
小结
学会线程控制后才算是真正学会了使用RxJava。RxJava的使用十分灵活,想要对其熟悉使用只有一个办法,那就是多用啦,熟能生巧。
转自:http://www.jianshu.com/p/ecfb9d68d2a2
相关文章推荐
- fragment与fragment,activity与fragment传值
- android native hook方法
- Android数据库中的CRUD参数详解
- Android屏幕适配--六大适配方法(你必须知道)
- Android Bitmap深入介绍(一)---基础
- Android第一行代码源码分享
- Android快速开发最常用的工具类集锦--好东西在精不在多
- Android地图应用新视界--mapbox的应用开发参考网址大全
- android适应不同的屏幕
- Android手动检查并申请权限
- Android地图应用新视界--mapbox的应用开发之简单功能提取篇
- Android自定义View---------ColorfulToggleButton
- Android 沉浸式状态栏
- Android Gradle 技巧之二: 最爱命令行
- ListView 使用问题
- android 进程注入流程
- Android地图应用新视界--mapbox的应用开发之初始集成篇
- [Android问答] px、dp和sp,这些单位有什么区别?
- android ANR产生原因和解决办法
- Android之内存缓存——LruCache的使用及原理