在RxJava中,可以使用Observable.create()
方法創(chuàng)建一個基于觀察者的Observable對象。然后,通過調(diào)用map()
操作符,將每個值映射為一個計數(shù)器,使用takeUntil()
操作符來停止發(fā)出事件。以下是一個簡單的示例:
import io.reactivex.Observable;
import io.reactivex.functions.Function;
import java.util.concurrent.TimeUnit;
public class Counter {
public static void main(String[] args) {
// 創(chuàng)建一個基于觀察者的Observable對象
Observable<Integer> countObservable = Observable.create(emitter -> {
int count = 0;
final int finalCount = 10;
emitter.onNext(count);
emitter.onComplete();
return new Emitter() {
@Override
protected void emit(Object... values) {
if (values.length == 1) {
int value = Integer.parseInt(values[0].toString());
if (value < finalCount) {
count++;
System.out.println("計數(shù)器值:" + count);
emitter.onNext(count);
} else {
emitter.onComplete();
}
} else if (values.length == 2) {
int value1 = Integer.parseInt(values[0].toString());
int value2 = Integer.parseInt(values[1].toString());
if (value1 < finalCount || value2 < finalCount) {
count++;
System.out.println("計數(shù)器值:" + count);
emitter.onNext(count);
} else {
emitter.onComplete();
}
} else {
emitter.onComplete();
}
}
};
});
// 開始計時并打印初始計數(shù)值
countObservable.subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("開始計時");
}
@Override
public void onNext(Integer integer) {
System.out.println("收到值:" + integer);
}
@Override
public void onError(Throwable e) {
System.out.println("發(fā)生錯誤:" + e.getMessage());
}
@Override
public void onComplete() {
System.out.println("結(jié)束計時");
}
});
// 模擬網(wǎng)絡(luò)請求,每秒鐘更新一次計數(shù)器值
countObservable.subscribeOn(Schedulers.elastic())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(integer -> System.out.println("計數(shù)器值:" + integer));
}
}
在這個示例中,我們首先創(chuàng)建了一個基于觀察者的Observable對象,并在其內(nèi)部定義了一個計數(shù)器。然后,通過調(diào)用subscribeOn()
方法指定了Observable的調(diào)度策略,使其在主線程上運行。最后,我們訂閱了這個Observable,并使用subscribe()
方法接收事件,打印出每次收到的值。
通過這種方式,我們可以實現(xiàn)一個簡單的、基于反應(yīng)式的計數(shù)器功能,可以每秒鐘增加一個值,并且可以在達(dá)到某個值后停止發(fā)出事件。
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。