onErrorReturn : 处理Observable中的onError事件(自己消化掉)并返回一个自己设定的数据
public static void test24(){
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onError(new NullPointerException("......"));
subscriber.onNext(3);
}
}).onErrorReturn(new Func1<Throwable, Integer>() {
@Override
public Integer call(Throwable throwable) {
return 10;
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
onErrorResumeNext/onExceptionResumeNext: 当第一个Observable发生错误时 就会调用第二个Observable
public static void test25(){
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onError(new NullPointerException("......"));
subscriber.onNext(3);
}
}).onErrorResumeNext(new Func1<Throwable, Observable<? extends Integer>>() {
@Override
public Observable<? extends Integer> call(Throwable throwable) {
Observable<Integer> integerObservable = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(4);
subscriber.onNext(5);
}
});
return integerObservable;
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
retry:如果原始的Observable发生错误,retry是从新订阅关系
public static void test27(){
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onError(new NullPointerException("......"));
subscriber.onNext(3);
}
})
.retry(3) // 重复订阅三次
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.v(TAG, "...call = " + e.getLocalizedMessage());
}
@Override
public void onNext(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
类似的函数还有 :
Javadoc: retry()) ⽆论收到多少次onError通知,都会继续订阅并发射原始Observable。
Javadoc: retry(long)) retry会最多重新订阅指定的次数,如果次数超了,不会尝试再次订阅
Javadoc: retry(Func2)
retryWhen
subscribe/observerOn: 指定被观察者和观察者运行的线程
public static void test28() {
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("test 28");
Log.v(TAG, "...test = " +Thread.currentThread().getName());
}
})
.subscribeOn(Schedulers.io()) // 指定被观察者线程
.observeOn(AndroidSchedulers.mainThread()) // 指定观察者线程
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG, "...call = " +Thread.currentThread().getName());
}
});
}
worker
public static void test29(){
final Scheduler.Worker worker = Schedulers.io().createWorker(); // 创建调度器
worker.schedule(new Action0() {
@Override
public void call() {
Log.v(TAG, "...call = " +Thread.currentThread().getName());
worker.unsubscribe(); // 避免内存浪费 回收
}
});
}
delaySubscription: 延迟订阅
public static void test30() {
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Android");
subscriber.onNext("java");
subscriber.onNext("python");
}
})
.delaySubscription(2,TimeUnit.SECONDS)
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG, "...call = " + s);
}
});
}
doOnEach: Observable每发送一个数据就会调用它
public static void test31() {
Observable.just(1,2,3)
.doOnEach(new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
Log.v(TAG, "...onNext = " + integer);
}
}).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
doOnNext: 和上面的一样
public static void test32() {
Observable.just(1,2,3)
.doOnNext(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...doOnNext = " + integer);
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
doOnSubscribe: 当被观察者被订阅的时候调用
public static void test33() {
Observable.just(1,2,3)
.doOnSubscribe(new Action0() {
@Override
public void call() {
Log.v(TAG, "...doOnSubscribe...... "); //先打印这句
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call = " + integer); // 后打印
}
});
}
doOnUnSubscribe : 什么时候取消订阅
public static void test34() {
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onCompleted(); // 当调用onCompleted方法时 取消订阅关系
subscriber.onNext(3);
subscriber.onCompleted();
}
})
.doOnUnsubscribe(new Action0() { // 当系统取消订阅关系时 调用这个方法
@Override
public void call() {
Log.v(TAG, "...doOnUnsubscribe... ");
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
log:
如果使用 unSafeSubscribe,那么即使调用了onCompleted方法 也不会解除订阅关系
public static void test34() {
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onCompleted();
subscriber.onNext(3);
subscriber.onCompleted();
}
})
.doOnUnsubscribe(new Action0() { // 当系统取消订阅关系时 调用这个方法
@Override
public void call() {
Log.v(TAG, "...doOnUnsubscribe... ");
}
})
.unsafeSubscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
seralize:
public static void test34() {
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onCompleted();
subscriber.onNext(3);
subscriber.onCompleted();
}
})
.serialize() // 只要调用了onCOmpleted方法 那么即使没有取消订阅 onCompleted后的数据也不会执行了
.doOnUnsubscribe(new Action0() { // 当系统取消订阅关系时 调用这个方法
@Override
public void call() {
Log.v(TAG, "...doOnUnsubscribe... ");
}
})
.unsafeSubscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
Log.v(TAG, "...call = " + integer);
}
});
}
timeOut: 设置发送数据的时间
public static void test35() {
Observable
.interval(2,TimeUnit.SECONDS)
.timeout(2,TimeUnit.SECONDS) // 可用于网络请求时候的设置
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Log.v(TAG, "...call = " + aLong);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.v(TAG, "...call = " + throwable);
}
});
}
using:
public static void test36() {
/* using(Func0,Func1,Action1)操作符接受三个参数:
1. ⼀个⽤于创建⼀次性资源的⼯⼚函数
2. ⼀个⽤于创建Observable的⼯⼚函数
3. ⼀个⽤于释放资源的函数*/
Observable.using(new Func0<String>() {
@Override
public String call() {
return "Hello android";
}
}, new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
return Observable.just(s);
}
}, new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG, "...清理资源 = " );
s = null;
}
})
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
Log.v(TAG, "...onCompleted = " );
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.v(TAG, "...onNext = " + s);
}
});
}
buffer: 数据缓存发送
public static void test37() {
// buff就是将发送的数据进行缓存 缓存长度由自己设置 达到缓存长度后就进行统一发送
// 如果被观察者和观察者不在同一线程 可能会发送数据丢失的情况
Observable<List<String>> buffer = Observable.just("1", "2", "3")
.buffer(2);
buffer.subscribe(new Action1<List<String>>() {
@Override
public void call(List<String> strings) {
Log.v(TAG, "...,....................");
for (int i = 0; i < strings.size(); i++) {
Log.v(TAG, "...call.. = " + strings.get(i));
}
}
});
}
window: 功能和buffer差不多,不同的是将一个Observable拆分成多个Observable
public static void test38() {
Observable<Observable<String>> window = Observable.just("1", "2", "3").window(2);
window.subscribe(new Action1<Observable<String>>() {
@Override
public void call(Observable<String> stringObservable) {
stringObservable.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.v(TAG, "...call.. = " + s);
}
});
}
});
}
map:Observable的数据转换 这里转换的只是对象里面的数据值而已 并不能转换对象类型
public static void test39() {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三",17));
students.add(new Student("李四",17));
students.add(new Student("张6",17));
Observable.from(students)
.map(new Func1<Student, Student>() {
@Override
public Student call(Student student) {
if (student.name.equals("李四"))
{
student.name = "hahah";
}
return student;
}
}).subscribe(new Action1<Student>() {
@Override
public void call(Student student) {
Log.v(TAG, "...call.. = " + student.name);
}
});
}
flatMap: 转换发送数据对象
public static void test40() {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("张三",17));
students.add(new Student("李四",17));
students.add(new Student("张六",17));
students.add(new Student("张一",12));
students.add(new Student("张二",11));
students.add(new Student("张五",10));
Observable.from(students)
.flatMap(new Func1<Student, Observable<LittleStudent>>() {
@Override
public Observable<LittleStudent> call(Student student) {
if (student.age < 15)
{
return Observable.just(new LittleStudent(student.name,student.age));
}
return null;
}
})
.subscribe(new Action1<LittleStudent>() {
@Override
public void call(LittleStudent littleStudent) {
Log.v(TAG, "...call.. = " + littleStudent.name);
}
});
}
这里可以发现 flatMap把发送的数据类型由Student--->LittleStudent
merge: 合并Observable
public static void test41() {
Observable<Integer> ob = Observable.just(1, 3, 5);
Observable<Integer> observable = Observable.just(2, 4, 6);
Observable.merge(ob,observable)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call.. = " + integer);
}
});
}
startWith: 可以在Observable发送之前的准备工作/(如果你想⼀个Observable发射的数据末尾追加⼀个数据序列可以使⽤Concat操作符。
Observable<String> o1 = Observable.just("模拟⽹络请求");
Observable<String> o2 = o1.startWith("⽹络请求之前的准备⼯作");
o2.subscribe(new Action1<String>() {
@Override
public void call(String value) {
Log.i(TAG, value);
}
});
zip: 两个Observable的压缩,具体算法看Func 假设被观察者o1发送的数据为1 2 ,被观察者o2发送的数据为3,4,5。那么zip压缩发送的数据个数以最低个也就是2个为准。
public static void test42() {
Observable<Integer> ob = Observable.just(1, 3, 5);
Observable<Integer> observable = Observable.just(2, 4, 6);
Observable.zip(ob, observable, new Func2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
return integer - integer2;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.v(TAG, "...call.. = " + integer);
}
});
}