Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("Hello");
emitter.onNext("RxJava");
emitter.onComplete();
}
})
.subscribeOn(Schedulers.io()) // 指定被观察者的执行线程
.observeOn(AndroidSchedulers.mainThread()) // 指定观察者的执行线程
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
// 订阅时调用
}
@Override
public void onNext(String s) {
// 接收到数据时调用
Log.d("RxJava", s);
}
@Override
public void onError(Throwable e) {
// 发生错误时调用
}
@Override
public void onComplete() {
// 数据流结束时调用
}
});
特性:
使用场景:
特性:
使用场景:
特性:
使用场景:
特性:
使用场景:
特性:
使用场景:
创建操作符用于从头开始创建Observable(被观察者对象)或其他类型的被观察者,并允许观察者的方法被编程调用
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
emitter.onNext(1);
emitter.onNext(2);
emitter.onNext(3);
emitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
// 开始订阅时的操作
}
@Override
public void onNext(Integer value) {
// 接收到事件时的操作
}
@Override
public void onError(Throwable e) {
// 发生错误时的操作
}
@Override
public void onComplete() {
// 完成时的操作
}
});
Observable.just(1, 2, 3, 4).subscribe(new Observer<Integer>() {
// ...省略订阅逻辑...
});
Observable<Integer> observable = Observable.defer(new Callable<Observable<Integer>>() {
@Override
public Observable<Integer> call() throws Exception {
// 根据条件动态创建Observable
if (someCondition) {
return Observable.just(1, 2, 3);
} else {
return Observable.just(4, 5, 6);
}
}
});
observable.subscribe(new Observer<Integer>() {
// ...省略订阅逻辑...
});
Integer[] items = {0, 1, 2, 3, 4, 5};
Observable.fromArray(items).subscribe(new Observer<Integer>() {
// ...省略订阅逻辑...
});
Observable.interval(1, TimeUnit.SECONDS).take(5).subscribe(new Observer<Long>() {
// ...省略订阅逻辑...
});
上述代码会每秒发送一个递增的整数,共发送5个。
Observable.range(1, 5).subscribe(new Observer<Integer>() {
// ...省略订阅逻辑...
});
上述代码会发送从1到5的整数序列。
Observable.just("Hello").repeat(3).subscribe(new Observer<String>() {
// ...省略订阅逻辑...
});
上述代码会重复发送字符串"Hello"三次。
Observable.timer(2, TimeUnit.SECONDS).subscribe(new Observer<Long>() {
// ...省略订阅逻辑...
});
转换操作符用于对Observable(被观察者对象)发射的数据进行转换,以便观察者能够接收到转换后的数据。
Observable.range(1, 4)
.map(i -> i * i)
.subscribe(i -> System.out.println(i)); // 输出:1, 4, 9, 16
List<Student> students = // ... 学生列表
Observable.from(students)
.flatMap(student -> Observable.fromIterable(student.getCourses()))
.subscribe(course -> System.out.println(course.getName()));
Observable.range(1, 5)
.scan(0, (sum, i) -> sum + i)
.subscribe(sum -> System.out.println(sum)); // 输出:0, 1, 3, 6, 10, 15(注意第一个输出是初始值0)
注意:在上面的示例中,scan的累积函数接受两个参数:一个是累积的结果(sum),另一个是当前的元素(i)。初始值设置为0。
组合操作符用于将多个 Observable(被观察者对象)组合成一个 Observable,以便能够同时处理多个数据源。
Observable.concat(
Observable.just(1, 2, 3),
Observable.just(4, 5, 6)
)
.subscribe(integer -> System.out.println("接收到的数据: " + integer));
// 输出将按顺序:1, 2, 3, 4, 5, 6
Observable.merge(
Observable.intervalRange(0, 3, 1, 1, TimeUnit.SECONDS),
Observable.intervalRange(10, 3, 1, 1, TimeUnit.SECONDS)
)
.subscribe(aLong -> System.out.println("接收事件: " + aLong));
// 输出将交错:0, 10, 1, 11, 2, 12…
Observable.zip(
Observable.just(1, 2, 3),
Observable.just('a', 'b', 'c'),
(integer, c) -> integer + "-" + c
)
.subscribe(s -> System.out.println("zip 结果: " + s));
// 输出:1-a, 2-b, 3-c
Observable<Long> observable1 = Observable.timer(0, 1000, TimeUnit.MILLISECONDS)
.map(aLong -> aLong * 5)
.take(5);
Observable<Long> observable2 = Observable.timer(500, 1000, TimeUnit.MILLISECONDS)
.map(aLong -> aLong * 10)
.take(5);
Observable.combineLatest(
observable1,
observable2,
(aLong, aLong2) -> aLong + aLong2
)
.subscribe(aLong -> System.out.println("combineLatest 结果: " + aLong));
// 输出将基于两个 Observable 的最新数据进行合并
Observable.just(2, 3, 4)
.startWith(1)
.subscribe(integer -> System.out.println("接收到的数据: " + integer));
// 输出:1, 2, 3, 4
过滤操作符用于根据特定条件筛选 Observable 发射的数据项。这些操作符允许你定义逻辑来保留或丢弃流中的元素。
Observable.fromIterable(Arrays.asList(1, 2, 3, 4, 5, 6))
.filter(x -> x % 2 == 0)
.subscribe(System.out::println); // 输出: 2, 4, 6
Observable.range(1, 10)
.take(3)
.subscribe(System.out::println); // 输出: 1, 2, 3
Observable.range(1, 10)
.takeLast(3)
.subscribe(System.out::println); // 输出: 8, 9, 10(在 Observable 完成时)
Observable.range(1, 10)
.takeWhile(x -> x % 2 != 0)
.subscribe(System.out::println); // 输出: 1(因为 1 是奇数,但 2 不是)
Observable.range(1, 10)
.skip(3)
.subscribe(System.out::println); // 输出: 4, 5, 6, 7, 8, 9, 10
Observable.range(1, 10)
.skipWhile(x -> x % 2 != 0)
.subscribe(System.out::println); // 输出: 2, 4, 6, 8, 10(因为从 2 开始都是偶数)
条件操作符允许通过设置函数来判断被观察者(Observable)发送的事件是否符合特定条件,从而决定如何处理这些事件。
Observable.just(1, 2, 3, 4, 5, 6)
.all(integer -> integer < 10)
.subscribe(result -> System.out.println("All numbers are less than 10: " + result)); // 输出: All numbers are less than 10: true
Observable.just(1, 2, 3, 4, 5)
.contains(3)
.subscribe(result -> System.out.println("Contains 3: " + result)); // 输出: Contains 3: true
Observable.just(1, 3, 5, 7, 8)
.any(integer -> integer % 2 == 0)
.subscribe(result -> System.out.println("Exists even number: " + result)); // 输出: Exists even number: true
Observable.empty()
.isEmpty()
.subscribe(result -> System.out.println("Is empty: " + result)); // 输出: Is empty: true
Observable.range(1, 10)
.takeWhile(integer -> integer < 5)
.subscribe(System.out::println); // 输出: 1, 2, 3, 4
Observable.range(1, 10)
.takeUntil(integer -> integer == 5)
.subscribe(System.out::println); // 输出: 1, 2, 3, 4, 5(注意:5 也会被发射,因为条件是“直到”满足时停止)
或者,使用另一个 Observable 来停止发射:
Observable.interval(1, TimeUnit.SECONDS)
.takeUntil(Observable.timer(5, TimeUnit.SECONDS))
.subscribe(System.out::println); // 输出: 每秒发射一个数字,直到 5 秒后停止
Observable.range(1, 10)
.skipWhile(integer -> integer < 5)
.subscribe(System.out::println); // 输出: 5, 6, 7, 8, 9
Observable.interval(1, TimeUnit.SECONDS)
.skipUntil(Observable.timer(3, TimeUnit.SECONDS))
.subscribe(System.out::println); // 前 3 秒发射的元素被跳过,从第 4 秒开始发射
Observable.just(1, 2, 3)
.sequenceEqual(Observable.just(1, 2, 3))
.subscribe(result -> System.out.println("Sequences are equal: " + result)); // 输出: Sequences are equal: true