2016-12-20 2 views
1

Après onError, mon observable cesse de fonctionner. Comment puis-je éviter cela?Comment éviter l'arrêt observable après onError

Voici mon autocomplete Code observable et abonnement:

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

Que voulez-vous faire en cas d'erreur? –

+0

Il suffit de le négliger et de passer à autre chose. C'est autocomplete. Par exemple, lorsqu'il n'y a pas de connexion réseau, onError est appelé et observez les arrêts. Je veux qu'il émette quand la connexion réseau est revenue. –

+1

Je ne connais pas très bien RxJava, mais ça sonne comme un 'retryWhen'. https://github.com/ReactiveX/RxJava/wiki/Error-Handling-Operators –

Répondre

1

Il est simple, il suffit d'ignorer les erreurs:

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

Notez que cela est potentiellement dangereux, comme vous ignorez tous les erreurs; dans ce cas, c'est probablement OK, mais faites attention à ne pas trop utiliser cela.

+0

Salut @Tassos, merci mais réessayer semble fonctionner pour moi. Cela ne s'arrête pas observable. Pouvez-vous me dire pourquoi devrais-je utiliser onErrorResumeNext() au lieu de retry()? Ou est-ce juste une suggestion alternative? –

+0

Si vous ajoutez 'retryWhen' après le' flatMap', il se désinscrit et se réabonne à l'original observable, ce qui signifie que vous perdrez 400 ms de rebond. –

+0

Merci beaucoup, @Tassos. –