2017-01-24 2 views
0

Je viens juste de commencer à apprendre à utiliser RxJava 2 et Retrofit 2 sur Android. J'ai suivi un certain nombre de tutoriels et je suis capable de récupérer des données de mon serveur. Ma question est, quelle est la façon standard d'accéder facilement à ces données récupérées. Actuellement GSON le parse dans un objet, j'imprime le toString, mais c'est tout.Récupération des données d'un objet Observable en utilisant RxJava 2 et Retrofit 2

J'ai cette interface pour définir ma requête POST:

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

je crée l'objet Rénovation:

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

Je crée ensuite un objet pour contenir le corps JSON de ma demande POST:

FacebookAccessToken facebookAccessToken = new FacebookAccessToken(); 

Je crée alors le observable de mon interface:

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

Enfin, je souscris à l'observable, en observant sur le thread principal, mais faire la demande sur un thread de travail (je pense), je connecte les résultats:

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

L'imprimante toString correctement sortir les informations utilisateur reçues du serveur. Quelle est la manière standard d'utiliser cet objet que j'obtiens dans la fonction lambda? Je voudrais le stocker dans la base de données, ou au moins l'enregistrer dans un objet dans l'activité. Comment devrais-je faire cela?

Répondre

1

Votre interprétation de ce qui se passe par le fil est correcte. Vous faites la demande sur un nouveau thread et le lambda dans subscribe() sera appelé sur le thread UI

Vous pouvez simplement écrire le reste du code dans la fonction lambda. Vous pouvez accéder à la classe qui l'entoure et l'enregistrer dans un champ ou accéder à une classe/méthode de base de données à partir de là. Notez que vous avez seulement besoin d'observer sur le thread principal si vous voulez accéder à ui ici. Si vous voulez simplement l'enregistrer, vous pouvez supprimer l'appel observerOn() et rester sur le fil d'arrière-plan. Je recommande également d'utiliser Schedulers.io() pour subscribeOn() car il s'agit d'un pool de threads destiné aux opérations io, y compris les opérations réseau et l'accès à la base de données.