RxJava过滤器并对事件做出反应?

时间:2016-11-09 11:00:58

标签: android rx-java rx-android

我想使用AndroidRxJava应用程序中测试具有特定格式的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()的情况下测试数据条形码的好方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以引入单独的类型来描述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>() {

})