2016-07-14 5 views
0

Um RxAndroid besser zu verstehen, fand ich this Repo, die voll von nützlichen Beispielen mit RxAndroid ist, vor allem in Kombination mit Retrofit.RxAndroid http Anfrage im Hintergrund mit Retrofit

Also, wenn ich mir this Teil des Repos anschaue, kann ich einen http-Aufruf machen, indem ich auf eine Schaltfläche klicke, die im Hintergrund zu laufen scheint, oder?

Was ist, wenn ich diese App habe, die eine Aktivität/Fragment zeigen und gleichzeitig einen http-Aufruf auf dem Hintergrund und zeigen Sie die Daten, wenn es irgendwelche erhalten?

So zum Beispiel habe ich dieses Fragment mit onStart

@Override 
public void onStart() { 
    super.onStart(); 

    pomagistoService 
      .getAgenda() 
      .subscribeOn(Schedulers.newThread()) // <- run in background right? 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<List<Appointment>>() { 
       @Override 
       public void onCompleted() { } 

       @Override 
       public void onError(Throwable e) { } 

       @Override 
       public void onNext(List<Appointment> appointments) { 
        // show data in ListView 
       } 
      }); 
} 

Wenn ich dieses Fragment ein Listview sofort enthält die Daten beginnen, die durch den HTTP-Aufruf empfangen wird.

Jetzt ist die Frage/Verwunderung, die ich habe: Führt dieser HTTP-Aufruf im Hintergrund?

Ich frage dies wegen der Daten, die sofort da sind, wenn das Fragment erscheint, also kann ich es nicht wirklich beobachten.

+1

ja der HTTP-Aufruf im Hintergrund ausgeführt –

+0

@AmitShekhar oke, also sagen wir, der http-Aufruf dauert 5 Sekunden, dauert es nicht 5 Sekunden für das Fragment zu erscheinen? Das Fragment erscheint nur (ohne Daten)? –

+0

Sie sollten die Fragmentliste von der onNext aktualisieren() –

Antwort

0

Normalerweise sollten Sie für die Netzwerkanforderung nicht Schedulers.newThread(), sondern Schedulers.io() verwenden. Um eine Verzögerung zu erhalten, bevor die Anfrage ausgeführt wird, und um eine Chance zu bekommen, ein Fragment ohne Daten zu sehen, versuchen Sie .delay(5, TimeUnit.SECONDS) zu benutzen, um 5 Sekunden Verzögerung vor dem Anruf zu machen.

0

Wenn Sie subscribeOn(Schedulers.io()) verwenden, dann sagen Sie RxJava, um seine Arbeit im Hintergrund (ein anderer Thread) zu tun. Schedulers.io() wird normalerweise für E/A-Operationen wie Netzwerk verwendet, können Sie Schedulers.computation() für lange Verarbeitungsvorgänge lokal ausgeführt werden.

und indem Sie observeOn(AndroidSchedulers.mainThread()) verwenden, sagen Sie, dass Sie das Endergebnis im Hauptthread erhalten möchten, damit Sie es anzeigen oder mit ui-Ereignissen umgehen können.

einige häufiger Fehler ist die Verwirrung, wenn subscribeOn() und observeOn() verwenden, so, um es Ihnen leicht zu machen .. Sie sind immer wollen die Ergebnisse auf Hauptthread beobachten, sie in UI zu reflektieren sonst verwenden, was Ihrem Fall passen.