我想在使用RxJava
的Android
应用程序中测试具有特定格式的QR码。我需要检查QR码的几个条件,如果是真的,我需要停止进一步检查并对它们做出反应,例如在UI中显示QR码无效的错误消息。
我读到不建议使用Observable.error
,因为它应该只用于极端事件,但我过滤的事件不是极端的,但可以预期,例如扫描的QR码不是为我的应用程序创建的,或者QR码中包含的数据无效。否则我就会这样想了:
Observable.just(barcode)
.doOnNext(new Action1<Barcode>() {
@Override
public void call(Barcode barcode) {
if(barcode.rawValue == null) {
throw new RuntimeException("empty");
}
if(barcode.rawValue == null) {
throw new RuntimeException("empty");
}
}
})
.onErrorResumeNext(new Func1<Throwable, Observable<? extends Barcode>>() {
@Override
public Observable<? extends Barcode> call(Throwable throwable) {
//do something here
}
})
.subscribe(new Subscriber<Barcode>() {
//update UI to show result
});
在不将流发送到onError()
的情况下测试我的条形码数据的好做法是什么?
您可以引入一个单独的类型来描述Barcode
扫描结果。例如
class BarcodeScanningResult {
Barcode barcode;
String error;
public BarcodeScanningResult(Barcode barcode, String error) {
this.barcode = barcode;
this.error = error;
}
}
然后使用它:
Observable.just(barcode)
.map(new Func1<Barcode, BarcodeScanningResult>() {
@Override
public BarcodeScanningResult call(Barcode barcode) {
if(barcode.rawValue == null) {
return new BarcodeScanningResult(barcode, "empty")
}
if(barcode.rawValue.trim().length == 0) {
return new BarcodeScanningResult(barcode, "blank");
}
return new BarcodeScanningResult(barcode)
}
}).subscribe(new Subscriber<BarcodeScanningResult>() {
})