2016-11-09 2 views
0

Я хочу протестировать QR-код с определенным форматом в приложении Android, используя RxJava. Мне нужно проверить QR-код на несколько условий, и если это правда, мне нужно будет прекратить дальнейшую проверку и реагировать на них, например. покажите сообщение об ошибке в пользовательском интерфейсе, что QR-код недействителен.RxJava фильтр и реагировать на события?

Я читал, что использование 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()?

ответ

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>() { 

}) 
Смежные вопросы