2017-01-24 3 views
0

Ich habe gerade angefangen zu lernen, wie RxJava 2 und Retrofit 2 in Android zu verwenden. Ich habe eine Reihe von Tutorials verfolgt und kann Daten von meinem Server abrufen. Meine Frage ist, was ist der Standard Weg, einfach auf diese abgerufenen Daten zuzugreifen. Zur Zeit analysiert GSON es in ein Objekt, ich drucke den toString, aber das ist es.Abrufen von Daten von Observable Objekt mit RxJava 2 und Retrofit 2

Ich habe diese Schnittstelle meine POST-Anforderung zu definieren:

public interface FacebookAppLoginService { 
    @POST("app/fbapp_login") 
    Observable<User> getUser(@Body FacebookAccessToken facebookAccessToken); 
} 

Ich schaffe das Retrofit-Objekt:

Retrofit retrofit = new Retrofit.Builder() 
      .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .baseUrl("http://rocky-garden-56471.herokuapp.com/") 
      .build(); 

ich ein Objekt dann erstellen, um die JSON Körper meines POST-Anfrage zu enthalten:

FacebookAccessToken facebookAccessToken = new FacebookAccessToken(); 

Ich erstelle dann das Observable von meiner Schnittstelle:

Schließlich
Observable<User> newUser = facebookAppLoginService.getUser(facebookAccessToken); 

, ich auf die beobachtbaren abonnieren, auf der Haupt-Thread zu beobachten, aber dabei die Anforderung auf einem Arbeitsthread (glaube ich), dann log ich die Ergebnisse:

newUser.subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(userInfo -> { 
         Log.i("Server Call", "Received: " + userInfo.toString()); 
       }); 

Die toString richtig druckt die vom Server empfangenen Benutzerinformationen aus. Wie kann ich dieses Objekt in der Lambda-Funktion verwenden? Ich möchte es in der Datenbank speichern oder zumindest in einem Objekt innerhalb der Aktivität speichern. Wie soll ich das machen?

Antwort

1

Ihre Interpretation dessen, was threadwise passiert, ist korrekt. Sie tun die Anfrage für einen neuen Thread und das Lambda in subscribe() wird auf dem UI-Thread aufgerufen

Sie können einfach den Rest des Codes in der Lambda-Funktion schreiben. Sie können auf die umgebende Klasse zugreifen und sie dort in einem Feld speichern oder von dort auf eine Datenbankklasse/-methode zugreifen. Beachten Sie, dass Sie nur im Hauptthread beobachten müssen, wenn Sie hier auf ui zugreifen möchten. Wenn Sie es nur speichern möchten, können Sie den Aufruf von observeOn() entfernen und im Hintergrundthread bleiben. Ich würde auch empfehlen, Schedulers.io() für die subscribeOn() zu verwenden, weil es ein Threadpool ist, der für IO-Operationen einschließlich Netzwerkoperationen und Datenbankzugriff gedacht ist.

Verwandte Themen