RxJava过滤并响应事件



我想在使用RxJavaAndroid应用程序中测试具有特定格式的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>() {
})

相关内容

  • 没有找到相关文章

最新更新