RxJava中多线程机制

RxJava中多线程机制

RxJava简介

是一个在Java虚拟机上实现的响应式扩展库:提供了基于observable序列实现的异步调用及基于事件编程。

多线程

RxJava虽然概念比较容易理解,但上手并不容易,而RxJava多线程的机制非常灵活,更需要深入理解。

请参考这篇文章做深入了解,http://gank.io/post/560e15be2dca930e00da1083

实际测试

我准备了如下代码测试RxJava的线程分配机制:

    ...
    public static void main(String[] args) throws Exception {
        Observable.just("a","b","cc")
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.newThread())
            .map(input -> {
                log("map method in thread: " + Thread.currentThread().getName());
                return input + " == map process";
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.newThread())
            .map(input -> {
                log("map2 method in thread: " + Thread.currentThread().getName());
                return input + " == map2 process";
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(Schedulers.newThread())
            .subscribe(input -> {
                log("subscribe method in thread: " + Thread.currentThread().getName());
                System.out.println(input);
            });

        Thread.sleep(2000);
    }
    ...

输出结果:

map method in thread: RxNewThreadScheduler-5 
map method in thread: RxNewThreadScheduler-5
map2 method in thread: RxNewThreadScheduler-3
map method in thread: RxNewThreadScheduler-5
map2 method in thread: RxNewThreadScheduler-3
map2 method in thread: RxNewThreadScheduler-3
subscribe method in thread: RxNewThreadScheduler-1
a == map process == map2 process
subscribe method in thread: RxNewThreadScheduler-1
b == map process == map2 process
subscribe method in thread: RxNewThreadScheduler-1
cc == map process == map2 process

测试结论

  • observeOn决定下游代码运行的线程
  • observeOn不定义是默认使用当前运行的线程
  • subscribeOn决定最原始数据源发射数据代码运行的线程,而接下来的发射数据代码是由observeOn决定的
  • RxJava分配线程时是通过调用链自下而上处理,所以最上面的subscribeOn会覆盖下面的定义,也就是说subscribeOn在调用链中最多定义一次就可以,位置任意

具体应用场景

上面说了那么多,好像并没有什么实际的应用价值,最后,不免俗套的举一个Android开发中的应用场景。

需求: 从网络上下载图片,保存到本地并显示到ImageView中

示例代码如下,用到RxAndroid和Retrofit

retrofitService.getImage(url)
    .subscribeOn(Schedulers.io())
    .map(bitmap -> {
        saveTodisk(bitmap);
        return bitmap;
    })
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

访问网络及保存图片都运行在io线程,显示图片运行在主线程,保证界面不卡顿。

所以RxJava让事情变得简单,不管是多线程控制或者业务处理都可以保持在一个调用链上。既保持逻辑的完整又具有灵活扩展的特性,是不可多得的一个利器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值