2015-01-14 10 views
6

1., habe ich versucht,Wie Teilnehmer zu halten, nachdem onError (RxJava)

// used retrofit 
public interface ApiService { 
    @GET(/get_some_data) 
    Observable<SomeData> getSomeData(); 
} 



// clickStream created by onClick event 
// No.1 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

das ist in Ordnung, wenn getSomeData() Erfolg. Ich kann mit jedem Klick einige Daten erhalten.

aber wenn Fehler auftreten, abgemeldet. (so wird Klicken Sie nicht nach Fehler funktioniert)


2., versuchte ich unten. (Mit onErrorResumeNext), aber unsubscribed.

(nicht onError nennen, aber onComplete genannt. So unsubscribed)

// No.2 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .onErrorResumeNext(throwable -> Observable.empty()) // add this line 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

3. habe ich versucht, unten. (Mit Wiederholungs)

// No.3 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .retry(5)           // add this line 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

das ist besser als keine .1. aber nicht beschrieben.


Ich möchte Refresh-Taste, die nach Fehler funktioniert.

Ich möchte

  1. Kann ich halten oder wieder abonnieren Teilnehmer kennen zu lernen?
  2. Ist das ein richtiger Weg in Rxjava?

Entschuldigung für mein schlechtes Englisch.

Antwort

8

Ihre Nr. 2 war ganz in der Nähe - versuchen Sie dies:

clickStream 
.flatMap(e -> apiService.getSomeData() 
    .onErrorResumeNext(throwable -> Observable.empty())) // add this line 
.subscribe(
    success -> Log.d("tag", "success"), 
    error -> Log.d("tag", "error"), 
    () -> Log.d("tag", "complete")) 

Beachten Sie, dass ich eine geschlossene Klammer gerade bewegt, so dass die onErrorResumeNext jetzt nach jeder Fehler genannt wird und ein Teil der „inneren“ beobachtbar ist.

+0

Es hat funktioniert! Ich kann Abonnenten nach onError behalten. Der Schlüssel ist "** inner ** beobachtbar". Danke! – kyanro

+0

versteckt/unterdrückt dies nicht jeden Fehler? –

+0

Ja, natürlich - entweder Sie bekommen 'onError' oder Sie können weiterhin' 'Subscriber'' verwenden, aber nicht beides. Was Sie jedoch tun könnten, ist eine Art Fehlermeldung: 'thrownable -> Observable.just (new ThereWasSomeProblemWithTheApi()))'. Das 'T' in' Observable 'müsste dann eine gemeinsame Schnittstelle sein, die von' ThereWasSomeProblemWithTheApi' und Ihrem eigentlichen Datentyp gemeinsam genutzt wird. –