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);
});

相关代码在这里

你可能感兴趣的:(多线程,android,lambda,rxjava)