RxJava学习(七)
来源:互联网 发布:局部搜索算法有哪些 编辑:程序博客网 时间:2024/05/16 07:52
一.概述
前面我们已经大概了解了Obserable的概念,今天我们来看看另外一个东西,叫什么呢?Single
何为Single
我们先看看官方的解释
The Single class implements the Reactive Pattern for a single value response. See {@link Observable} for the * implementation of the Reactive Pattern for a stream or vector of values. * <p> * {@code Single} behaves the same as {@link Observable} except that it can only emit either a single successful * value, or an error (there is no "onComplete" notification as there is for {@link Observable}) * <p> * Like an {@link Observable}, a {@code Single} is lazy, can be either "hot" or "cold", synchronous or * asynchronous.
我给大家大概翻译一下说了些什么东西
Single的作用类似Obserable,但是每次只是发射一个值,onSucces或者onError,而Obserable有onNext,onComplete,onError,同Obserable一样,也可以实现同步和异步操作。
看完了概念,我们直接写一个代码试试
Single基本用法
Single.just(addValue(1,2)).subscribe(new SingleSubscriber<Integer>() { @Override public void onSuccess(Integer value) { mTextView.setText(value+""); } @Override public void onError(Throwable error) { } }); } public int addValue(int a,int b){ return a+b; }
这里我们使用了SingleSubscriber来订阅,执行成功后会走onSucess方法,给TextView设置值为3.
Single进阶
compose操作符:对结果进行转换
Single.just(addValue(1,2)).compose(new Single.Transformer<Integer, String>() { @Override public Single<String> call(Single<Integer> integerSingle) { return integerSingle.map(new Func1<Integer, String>() { @Override public String call(Integer integer) { return integer+" android"; } }); } }).subscribe(new SingleSubscriber<String>() { @Override public void onSuccess(String value) { mTextView.setText(value+""); } @Override public void onError(Throwable error) { } }); }
concat操作符:
用来连接多个Single和Observable发射的数据
Single.concat(Single.just(checkNetwork()), Single.just(checkMemory()), Single.just(doSth()))
仅仅用来连接Single顺序执行的,比如顺序执行检查网络,检查内存,执行任务,注意:如果某个Single调用了onError()会导致被中断。
create操作符
Single.create(new Single.OnSubscribe<Integer>() { @Override public void call(SingleSubscriber<? super Integer> singleSubscriber) { singleSubscriber.onSuccess(addValue(1, 2)); } }).subscribeOn(Schedulers.io()).subscribe(new Subscriber<Integer>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Integer integer) { mTextView.setText(integer.intValue() + ""); } }); }
值得注意的是之前我们使用的just()是一种特殊的create(),它不能指定Schedulers。只能在当前线程中运行,而create()可以指定Schedulers实现异步处理。且just()不管是否被subscribe()订阅均会被调用,而create()如果不被订阅是不会被调用的。所以我们通常可以用just()传递简单参数,而用create()处理复杂异步逻辑。
error操作符
返回一个立即给订阅者发射错误通知的Single,一般用于调试,不常用
// 如人为让concat中断:Single.concat(s1, Single.error(new Throwable("error"), s2)).subscribe();
flatMap操作符
flatMap
Single.just(1).flatMap(new Func1<Integer, Single<String>>() { @Override public Single<String> call(Integer integer) { return Single.just(integer+""); } }).subscribe(new Action1<String>() {//注意这里返回值的区别 @Override public void call(String s) { } }); Single.just(2).map(new Func1<Integer, Single<String>>() { @Override public Single call(Integer integer) { return null; } }).subscribe(new Action1<Single<String>>() {//注意这里返回值的区别 @Override public void call(Single<String> stringSingle) { } }); }
一般map()是用于一对一的返回,而flatMap()用于一对0~多的返回。比如我们看下面这个例子:
static Observable<List<String>> query(){ List<String> list = Arrays.asList("Java", "Android", "Html"); return Observable.just(list); }
//输入类型是List<String>,使用flatMap则最后输出变为String query().flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> strings) { return Observable.from(strings); } }).subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println("=====flapMap "+s); } });
04-28 12:22:37.157 30923-30923/com.example.rxjavademo I/System.out: =====flapMap Java04-28 12:22:37.157 30923-30923/com.example.rxjavademo I/System.out: =====flapMap Android04-28 12:22:37.157 30923-30923/com.example.rxjavademo I/System.out: =====flapMap Html
这里传入了一个List,传出了多个String。而且应该多用于Observable,很少用在Single中,即使用也不如map()来的爽快,这里只做了解即可。
flatMapObservable操作符
刚刚说到flatMap()和map()类似,区别在于flatMap可以返回多个值,而map只能返回一个。但在Single中flatMap只能返回Single,几乎等同于map实用性不高。而flatMapObservable就不同了,它支持将Single转化为Observable对象,可以返回多个值。下面这个例子介绍如何将Single转化为Observable。
Single.just(2).flatMapObservable(new Func1<Integer, Observable<String>>() { @Override public Observable<String> call(Integer integer) { return Observable.just("a","b","c"); } }).subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println("========result: "+s);//a,b,c } });
merge & mergeWith操作符
merge操作符类似于concat,他们的区别见下图
subscribeOn操作符
用于指定异步任务的线程,常见的有:
Schedulers.computation( );// 计算线程Schedulers.from(executor);// 自定义Schedulers.immediate();// 当前线程Schedulers.io();// io线程Schedulers.newThread();// 创建新线程Schedulers.trampoline();// 当前线程队列执行
onErrorReturn操作符
相当于try catch中的return,具体意思就是当函数抛出错误的时候给出一个返回值,看代码:
Single.create(new Single.OnSubscribe<String>() { @Override public void call(SingleSubscriber<? super String> singleSubscriber) { singleSubscriber.onError(new Throwable("x")); } }).onErrorReturn(new Func1<Throwable, String>() { @Override public String call(Throwable throwable) { return "e"; } }).subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println("======result: "+s);//输出e } });
observeOn
指定观察者所在线程,常用的是
AndroidSchedulers.mainThread();
timeout操作符
超时操作操作,在指定时间内如果没有调用onSuccess()就判定为失败,且可支持失败的时候调用其他Single()
toSingle操作符
将传入一个参数的Observable转换为Single
Observable.just(2).toSingle();
zip & zipWith操作符
如果说flatMap()是将一个Single变成多个的操作,那么zip刚刚相反,他可以将多个Single整合为一个
Single<Integer> s1 = Single.just(1); Single<Integer> s2 = Single.just(2); Single.zip(s1, s2, new Func2<Integer, Integer, String>() { @Override public String call(Integer integer, Integer integer2) { return integer+"--"+integer2; } }).subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println("========: "+s);//结果是1--2 } });
最后给出源码下载地址
点此下载源码
- RxJava学习(七)
- RxJava 学习笔记(七) --- Filtering 过滤操作
- Rxjava学习
- RxJava学习
- rxjava 学习
- RxJAVA学习
- rxJava学习
- rxjava学习
- RxJava学习
- Rxjava学习
- 学习RxJava
- Rxjava学习
- RxJava 学习
- RxJava学习
- RxJava学习
- RxJava学习
- (七)RxJava定时器:timer
- RxJava入门七问(一)
- Versions使用心得
- Android图片缓存技术!直接用在你的项目中,简单方便高效
- C++中的dynamic_cast 操作符
- Java工程师成神之路
- List的remove方法误区
- RxJava学习(七)
- URLClassLoader 的一个小细节
- PS雪碧图快捷键
- 点双连通分量
- 解决 POI 操作2007格式的Excel报错问题:java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlOptionsz
- RDD中的转换和action(一)基本函数
- 配置Bugzilla 5 用SMTP方式发送邮件
- C++ Virtual详解
- 懒人爱家务_动画效果编程基础--AnimationAndroid