RxJava多线程操作

作者: 程序亦非猿 | 来源:发表于2015-09-25 09:22 被阅读12496次

前言

上一次学习了解了一些RxJava比较常用的操作符,这次来学习一下Rx的多线程操作.

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中有多少暂时不知道):

调度器类型 效果
Schedulers.computation( ) 用于计算任务,如事件循环或和回调处理,不要用于IO操作(IO操作请使用Schedulers.io());默认线程数等于处理器的数量
Schedulers.from(executor) 使用指定的Executor作为调度器
Schedulers.immediate( ) 在当前线程立即开始执行任务
Schedulers.io( ) 用于IO密集型任务,如异步阻塞IO操作,这个调度器的线程池会根据需要增长;对于普通的计算任务,请使用Schedulers.computation();Schedulers.io( )默认是一个CachedThreadScheduler,很像一个有线程缓存的新线程调度器
Schedulers.newThread( ) 为每个任务创建一个新线程
Schedulers.trampoline( ) 当其它排队的任务完成后,在当前线程排队开始执行

知道了Schedulser,那么接下去就要运用了.
下面介绍两个操作符,对,是操作符.

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:
--出自这里

myObservableServices.retrieveImage(url)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

上述代码表示,在Subscriber前面执行的代码都是在I/O线程中运行。最后,操作view的代码在主线程中运行.

PS:AndroidSchedulers.mainThread()是在Android中才有.

总的来说RxJava操作多线程还是比较简单方便的,而且容易控制.
暂时也就只会这么点,以后学习了再补充.
接下来应该是RxAndroid了,好开心.

参考

深入浅出RxJava三--响应式的好处

RxDoc-Scheduler

安利:
我的Github
我的微博
我的微信公众号:

微信公众号

相关文章

  • RxJava 线程池

    使用Scheduler RxJava中的多线程操作主要是由强大的Scheduler集合提供的。在RxJava中,我...

  • RxJava多线程操作

    前言 上一次学习了解了一些RxJava比较常用的操作符,这次来学习一下Rx的多线程操作. Scheduler-调度...

  • RxJava (源码待续)学习之调度器Scheduler

    上一篇:RxJava 源码学习之组合操作符 如果你想给Observable操作符链添加多线程功能,你可以指定操作符...

  • RxJava操作符系列四

    RxJava操作符系列传送门 RxJava操作符源码RxJava操作符系列一RxJava操作符系列二RxJava操...

  • RxJava操作符系列五

    RxJava操作符系列传送门 RxJava操作符源码RxJava操作符系列一RxJava操作符系列二RxJava操...

  • RxJava操作符系列六

    RxJava操作符系列传送门 RxJava操作符源码RxJava操作符系列一RxJava操作符系列二RxJava操...

  • RxJava Scheduler介绍

    如果想要在RxJava中引入多线程的功能,可以使用一些操作符使得RxJava在指定的线程上运行。 比如说一些耗时的...

  • RxJava操作符系列三

    RxJava操作符系列传送门 RxJava操作符源码RxJava操作符系列一RxJava操作符系列二 前言 在之前...

  • 常见内存泄漏以及个人解决方法

    内存泄漏问题检测使用 LeakCanary 多线程操作造成的内存泄漏以及崩溃问题(RxJava2为例) 首先配置B...

  • Kotlin Coroutines Flow 系列(四) 线程操

    七. Flow 线程操作 7.1 更为简化的线程切换 相对于 RxJava 多线程的学习曲线,Flow 对线程的切...

网友评论

  • 叮宕:我就想知道要在observer中使用webview该怎么办。
    程序亦非猿:@叮宕 没问题的
    程序亦非猿:@叮宕 没问题
  • 27872cc45bdc:请教一个问题,类似下面的代码:
    Observable.from(urllist).flatMap(new Func1<String, Observable<String>>() {
    @Override
    public Observable<String> call(String url) {
    Logger.d("Url:"+url);
    return requestContent(url);
    }
    }).subscribeOn(Schedulers.io())
    .subscribe(new Action1<String>() {
    @Override
    public void call(String content) {
    Logger.d("Thread:"+Thread.currentThread().getName());
    }
    });
    运行后可以发现虽然使用了flatMap,但是request(url)方法在没有指定线程的情况下,所有发射出去的Observable都运行在同一个子线程中,且保持了顺序,Log也是按照顺序Url和Content一组一组的执行。
    而如果request(url)添加了subscribeOn(schedulers.io())之后,观察log可以发现,每个observable顺序执行,但是结果符合flatMap的特性交替出现,并且log显示在不同子线程中。

    通过上面观察我自己得出的结论是,如果不为request()指定线程的话,多个url是按顺序在一个子线程中进行请求,如果其中一个阻塞,会导致后面的等待很久。而如果为request()指定了线程的话,就可以在多个线程发出多个request(),这样执行效率高很多。
    27872cc45bdc:不知道自己理解的对不对,求证明
  • Sunning:我有一个问题不解,麻烦指点一二。
    在Android中可以声明observerOn在Android主线程。
    但是我现在跑的是java项目要用哪个线程去接收呢?
    我现在用的interval和timer,subscribe都接收不到。。
    程序亦非猿:@Sunning 就在发送的线程里 可能你写错了吧
  • jeffhtli:"使用RxJava,你可以使用subscribeOn()指定观察者代码运行的线程",这里的“观察者”感觉不太合适,观察者是“Observer”,这里应该是Observable, "可观察的,被观察的",直接使用Observable和Subscriber倒是更清晰。本人愚见……
    程序亦非猿:@jeffhtli 恩是 你说的是 谢谢

本文标题:RxJava多线程操作

本文链接:https://www.haomeiwen.com/subject/kuxwcttx.html