RxJava之多线程、链式调用、Lambda表达式

参考文章

http://www.cnblogs.com/halzhang/p/4458095.html
http://www.tuicool.com/articles/MjyaUfq
http://www.tuicool.com/articles/VrQRvur
http://blog.csdn.net/lzyzsd/article/details/41833541

RxJava的Guihub地址

https://github.com/ReactiveX/RxJava

如果对RxJava还不了解,请先看这里

多线程处理

添加依赖

为了结果更加的直观,添加RxAndroid的依赖
dependencies {
    compile 'io.reactivex:rxjava:1.0.15'
    compile 'io.reactivex:rxandroid:1.0.1'
}

设置运行线程

通过subscribeOn()来指定Observer的运行线程,通过observeOn()指定Subscriber的运行线程。
默认情况下Observer和Subscriber都在当前调用该代码的线程中运行

subscribeOn//Observable被观察者运行的线程
observeOn//Subscriber观察者代码运行的线程

Schedulers.io() //运行至子线程(用于 I/O 操作)
Schedulers.computation() //运行至子线程(计算工作)
Schedulers.newThread() //运行至子线程(为任务创建的新线程)
AndroidSchedulers.mainThread() //运行至主线程 需添加compile ‘io.reactivex:rxandroid:1.0.1’

代码

observable = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            Log.i(TAG, "create 现在的线程:" + Thread.currentThread().getName());
            subscriber.onNext("hello world!");
            subscriber.onCompleted();
        }
    });
    observable = observable.map(new Func1<String, String>() {
        @Override
        public String call(String s) {
            Log.i(TAG, "map 现在的线程:" + Thread.currentThread().getName());
            return s + "这是尾巴~";
        }
    });
    observable = observable.subscribeOn(Schedulers.io()); //设置Subscriber(观察者)运行在子线程
    observable = observable.observeOn(AndroidSchedulers.mainThread()); //设置Observable(被观察者)运行在主线程

    Subscriber<String> subscriber = new Subscriber<String>() {
        @Override
        public void onCompleted() {
            Log.i(TAG, "onCompleted 现在的线程:" + Thread.currentThread().getName());
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            Log.i(TAG, "onNext 现在的线程:" + Thread.currentThread().getName());
            textView.setText(s);
        }
    };
    observable.subscribe(subscriber);

输出结果

create 现在的线程:RxCachedThreadScheduler-1
map 现在的线程:RxCachedThreadScheduler-1
onNext 现在的线程:main
onCompleted 现在的线程:main

并且Activity的textview显示为”hello world!这是尾巴~”;

终止调用

当调用Observable.subscribe(),会返回一个Subscription对象。这个对象代表了被观察者和订阅者之间的联系。
可以使用unsubscribe来终止调用

代码

修改以上代码

    Subscription subscription = observable.subscribe(subscriber);
    subscription.unsubscribe();
    Log.i(TAG, "被终止:" + subscription.isUnsubscribed());

输出结果

    被终止:true

链式调用

上面的代码为了方便理解没有使用链式调用,实际上,RxJava完全可以使用链式调用。

代码

以上面的代码为例,使用链式调用后

    Subscription subscription = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            Log.i(TAG, "create 现在的线程:" + Thread.currentThread().getName());
            subscriber.onNext("hello world!");
            subscriber.onCompleted();
        }
    }).map(new Func1<String, String>() {
        @Override
        public String call(String s) {
            Log.i(TAG, "map 现在的线程:" + Thread.currentThread().getName());
            return s + "这是尾巴~";
        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {
        @Override
        public void onCompleted() {
            Log.i(TAG, "onCompleted 现在的线程:" + Thread.currentThread().getName());
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(String s) {
            Log.i(TAG, "onNext 现在的线程:" + Thread.currentThread().getName());
            textView.setText(s);
        }
    });

输出结果

和上面的相同

更精简版

如果只是输入数据(使用just),并且不关心Subscriber的OnError和onCompleted,可以更加精简

        Subscription subscription = Observable.just("hello world!").map(new Func1<String, String>() {
        @Override
        public String call(String s) {
            Log.i(TAG, "map 现在的线程:" + Thread.currentThread().getName());
            return s + "这是尾巴~";
        }
    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {
            Log.i(TAG, "onNext 现在的线程:" + Thread.currentThread().getName());
            textView.setText(s);
        }
    });

使用lambda

Java8中可以使用lambda表达式,通过retrolambda这个gradle插件,在Android中可以支持Lambda。

具体Android Studio上retrolambda的配置可参照android上的JAVA8:使用retrolambda

代码

Observable.just("hello world!").map(s -> {
            Log.i(TAG, "map 现在的线程:" + Thread.currentThread().getName());
            return s + "这是尾巴~";
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(s -> {
            Log.i(TAG, "onNext 现在的线程:" + Thread.currentThread().getName());
            textView.setText(s);
});

相关代码在这里

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值