示例代码
示例中引入的RxJava库为RxJava2.0。
public class TempInfo {
public static final Random RANDOM = new Random();
private final String town;
private final int temp;
public TempInfo(String town, int temp) {
this.town = town;
this.temp = temp;
}
public static TempInfo fetch(String town){
/*if(RANDOM.nextInt(10) == 0){
throw new RuntimeException("Error!");
}*/
return new TempInfo(town, RANDOM.nextInt(100));
}
@Override
public String toString() {
return town + " : " + temp;
}
public String getTown() {
return town;
}
public int getTemp() {
return temp;
}
}
public class TempObserver implements Observer<TempInfo> {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(TempInfo tempInfo) {
System.out.println(tempInfo);
}
@Override
public void onError(Throwable e) {
System.out.println("Got problem: " + e.getMessage());
}
@Override
public void onComplete() {
System.out.println("Done!");
}
}
public static void main(String[] args) {
getNegativeTemperature("New York").blockingSubscribe(new TempObserver());
}
public static Observable<TempInfo> getTemperature(String town){
//create传参ObservableOnSubscribe,为一函数式接口,只有一个subscribe方法,传参ObservableEmitter
return Observable.create(emitter -> Observable.interval(1, TimeUnit.SECONDS).subscribe(i -> {
if(!emitter.isDisposed()){
if(i >= 5){
emitter.onComplete();
} else {
try {
emitter.onNext(TempInfo.fetch(town));
} catch (Exception e) {
emitter.onError(e);
}
}
}
}));
}
public static Observable<TempInfo> getCelsiusTemperature(String town){
return getTemperature(town).map(tempInfo -> new TempInfo(tempInfo.getTown(), (tempInfo.getTemp