前のセクションでは、RxJavaでのスレッド切り替えについて学びましたが、今日はその強力な演算子について学び始めます。私の意見では、オペレーターはrxjavaの魂のようなものであり、作成からサブスクリプション、データ送信、サブスクリプション解除、その他のリンクに至るまで、オブザーバーとオブザーバーのライフサイクル全体を実行します。さて、次の研究を始めましょう。
演算子を作成
作成()演算子
- メソッドのプレビュー:
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
- 役割:
オブザーバーを作成する
- 使い方
Observable<String> mObservable = Observable.create(new ObservableOnSubscribe<String>() {
emitter.onNext(" 1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onNext("4");
emitter.onComplete();
emitter.onNext(" 1");
emitter.onNext(" 2");
}
});
- 実際の戦闘
Observable<String> mObservable = Observable.create(new ObservableOnSubscribe<String>() { // 1.创建 Observable对象
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext(" 1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onNext("4");
emitter.onComplete();
emitter.onNext(" 1");
emitter.onNext(" 2");
}
});
Observer<String> mObserver = new Observer<String>() { // 2.创建observer
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe: ");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: " + e);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
};
mObservable.subscribe(mObserver);// 3.开始调用
ご覧のように、create()演算子を使用してObservableオブザーバーを作成し、ObservableEmitterを介してデータを送信するようにsubscribe()メソッドを書き換えました。
ただ()演算子
- メソッドのプレビュー
public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5, T item6) { }
- 機能と特徴
監視対象者を作成してイベントを送信します。送信されるイベントの数は10を超えることはできません。
- 使い方
Observable.just(1,2,3,4,5,6).subscribe(new Observer<Integer>() {
private Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
mDisposable=d;
Log.d(TAG, "onSubscribe: " + d.isDisposed());
}
@Override
public void onNext(Integer s) {
Log.d(TAG, "onNext: 接收到的数据是:"+s);
if (s>3){
mDisposable.dispose();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
オペレーターから
RxJava2 fromオペレーターは主に以下の4つを操作し、配列、Iterable、非同期タスクを送信するObservableを作成できます。
//数组
public static <T> Observable<T> fromArray(T... items)
//集合
public static <T> Observable<T> fromIterable(Iterable<? extends T> source)
//异步任务
public static <T> Observable<T> fromFuture(Future<? extends T> future)
//异步任务+超时时间
public static <T> Observable<T> fromFuture(Future<? extends T> future, long timeout, TimeUnit unit)
//异步任务+超时时间+线程调度器
public static <T> Observable<T> fromFuture(Future<? extends T> future, long timeout, TimeUnit unit, Scheduler scheduler)
//异步任务+线程调度器
public static <T> Observable<T> fromFuture(Future<? extends T> future, Scheduler scheduler)
//Reactive Streams中的发布者,使用方式类似create操作符,事件的发送由发布者(被观察者)自行决定
public static <T> Observable<T> fromPublisher(Publisher<? extends T> publisher)
fromArray()演算子
- メソッドのプレビュー
public static <T> Observable<T> fromArray(T... items) { ...}
-
機能と特徴:
- ちょうど同じように、データを送信し、データを配列の形式でロードしてから、送信すると、10個を超えるデータを送信できます。
- just()のソースコードを見ると、just()によって送信されたデータが実際に配列にデータをロードしてfromArray()から送信していることがわかります。したがって、just()は、fromArray()が送信するデータが10未満であることを意味します場合に応じてLiteバージョン。
@CheckReturnValue @NonNull @SchedulerSupport(SchedulerSupport.NONE) public static <T> Observable<T> just(T item1, T item2, T item3, T item4) { ObjectHelper.requireNonNull(item1, "item1 is null"); ObjectHelper.requireNonNull(item2, "item2 is null"); ObjectHelper.requireNonNull(item3, "item3 is null"); ObjectHelper.requireNonNull(item4, "item4 is null"); return fromArray(item1, item2, item3, item4); }
-
使い方
String[] strArray = {"kotlin","java","python","C++"};
Observable<String>observable1=Observable.fromArray(strArray);
fromIterable()演算子
- メソッドのプレビュー
public static <T> Observable<T> fromIterable(Iterable<? extends T> source) {...}
- 効果
オブザーバーを作成し、コレクションをオブザーバーに直接送信します。送信されるデータは1つまたは複数のサブ開発、または配列の形式で送信できるため、もちろんformIterable()演算子を介してコレクションを直接送信できることはわかっています実現した。
- 使い方
List<String> list = new ArrayList<>();
list.add("kotlin");
list.add("java");
list.add("C++");
list.add("python");
Observable.fromIterable(list);
fromCallable()演算子
- メソッドのプレビュー
public static <T> Observable<T> fromCallable(Callable<? extends T> supplier) { }
- 効果
Callableはjava.util.concurrentパッケージの下にあり、Runnableと同様ですが、戻り値があります。fromCallableから発行されたイベントはメインスレッドから送信されます。Observableの発行値を受け取るには、observeOnを使用してメインスレッドに切り替えます。
- 使い方
Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return "测试一下";
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
System.out.println("onNext():"+"接收到的数据为"+s+"\n所在线程为:"+Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
fromFuture()演算子
public static <T> Observable<T> fromFuture(Future<? extends T> future) {...}
from演算子を導入したとき、fromFuture()には次の4つのオーバーロードメソッドがあります。
//异步任务
public static <T> Observable<T> fromFuture(Future<? extends T> future)
//异步任务+超时时间
public static <T> Observable<T> fromFuture(Future<? extends T> future, long timeout, TimeUnit unit)
//异步任务+超时时间+线程调度器
public static <T> Observable<T> fromFuture(Future<? extends T> future, long timeout, TimeUnit unit, Scheduler scheduler)
//异步任务+线程调度器
public static <T> Observable<T> fromFuture(Future<? extends T> future, Scheduler scheduler)
fromFuture()の場合、実際にはRunnableに似ていますが、Runnableは実行後に結果を返さず、fromFuture()は実行結果をオブザーバーに返します。
// 异步任务
FutureTask<Integer> mFutureTask = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("---------开始执行任务------"+Thread.currentThread().getName());
Thread.sleep(3000); // 延时3秒以计算1+2+3+4+...并将结果返回
int sum = 0;
for (int i = 0; i <= 10; i++) {
sum += i;
}
return sum;
}
});
Observable.
fromFuture(mFutureTask)
.doOnSubscribe(new Consumer<Disposable>() {
@Override
public void accept(Disposable disposable) throws Exception {
mFutureTask.run();
}
})
.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
System.out.println("---------处理完毕并接收数据为:------"+integer+" "+Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
System.out.println("---------处理失败了:------"+e+Thread.currentThread().getName());
}
@Override
public void onComplete() {
}
} );
}
上記のプログラムでは、計算を3秒遅らせて、結果をサブスクライブしたオブザーバーに返しました。
さて、本日は主にそんなことを紹介していきますが、次回はRxjavaの他の強力な演算子について学び続けます。