2016-12-20 4 views
1

После onError мои наблюдаемые остановки работают. Как я могу избежать этого?Как избежать наблюдаемой остановки после onError

Вот мои автозаполнения наблюдаемый и подписка код:

public void subscribeAutoComplete() { 
    autoSubscription = RxTextView.textChangeEvents(clearableEditText) 
      .skip(1) 
      .map(textViewTextChangeEvent -> textViewTextChangeEvent.text().toString()) 
      .filter(s -> s.length() > 2) 
      .debounce(400, TimeUnit.MILLISECONDS) 
      .flatMap(text -> autoCompleteService.getAutoCompleteTerms(text) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread())) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<List<String>>() { 
       @Override 
       public void onCompleted() { 
        Log.d("rx", "oncomplete"); 
       } 

       @Override 
       public void onError(Throwable t) { 
        Log.e("rx", t.toString()); 
       } 

       @Override 
       public void onNext(List<String> strings) { 

        autoAdapter = new ArrayAdapter<>(MainActivity.this, 
           android.R.layout.simple_dropdown_item_1line, strings); 
        clearableEditText.setAdapter(autoAdapter); 
        clearableEditText.showDropDown(); 

       } 
      }); 

    compositeSubscriptions.add(autoSubscription); 
} 
+0

Что именно вы хотите сделать, если произошла ошибка? –

+0

Просто пренебрегайте им и двигайтесь дальше. Это автозаполнение. Например, когда нет сетевого подключения, вызывается onError и наблюдаемые остановки. Я хочу, чтобы он излучал, когда сетевое соединение вернулось. –

+1

Я не слишком хорошо разбираюсь в RxJava, но звучит как «retryWhen». https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators –

ответ

1

Это просто, просто игнорировать ошибки:

autoCompleteService.getAutoCompleteTerms(text).onErrorResumeNext(Observable.empty()) 

Обратите внимание, что это потенциально опасно, так как вы будете игнорировать все ошибки; в этом случае это, вероятно, хорошо, но будьте осторожны с этим.

+0

Привет, @ Tassos, спасибо, но попытка, похоже, работает на меня. Это не перестает наблюдаться. Можете ли вы сказать мне, почему я должен использовать onErrorResumeNext() вместо retry()? Или это просто альтернативное предложение? –

+0

Если вы добавите 'retryWhen' после' flatMap', он отменит подписку и повторно подпишет исходный наблюдаемый, что означает, что вы потеряете дебют на 400 мс. –

+0

спасибо, @Tassos. –