Android Mise à niveau avec RxJava pour récupérer les données de manière asynchrone


Exemple

À partir du dépôt GitHub de RxJava, RxJava est une implémentation Java de Reactive Extensions: une bibliothèque pour composer des programmes asynchrones et basés sur des événements en utilisant des séquences observables. Il étend le motif de l'observateur pour prendre en charge des séquences de données / événements et ajoute des opérateurs qui vous permettent de composer des séquences de manière déclarative tout en évitant les problèmes tels que le threading de bas niveau, la synchronisation, la sécurité des threads et les structures de données simultanées.

Retrofit est un client HTTP de type sécurisé pour Android et Java. Grâce à cela, les développeurs peuvent simplifier tous les aspects du réseau. Par exemple, nous allons télécharger des fichiers JSON et les afficher dans RecyclerView sous forme de liste.

Commencer:

Ajoutez les dépendances RxJava, RxAndroid et Retrofit dans votre fichier build.gradle au niveau de l'application: compile "io.reactivex:rxjava:1.1.6"
compile "io.reactivex:rxandroid:1.2.1"
compile "com.squareup.retrofit2:adapter-rxjava:2.0.2"
compile "com.google.code.gson:gson:2.6.2"
compile "com.squareup.retrofit2:retrofit:2.0.2"
compile "com.squareup.retrofit2:converter-gson:2.0.2"

Définir ApiClient et ApiInterface pour échanger des données du serveur

public class ApiClient {

private static Retrofit retrofitInstance = null;
private static final String BASE_URL = "https://api.github.com/";

public static Retrofit getInstance() {
    if (retrofitInstance == null) {
        retrofitInstance = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofitInstance;
}

public static <T> T createRetrofitService(final Class<T> clazz, final String endPoint) {
    final Retrofit restAdapter = new Retrofit.Builder()
            .baseUrl(endPoint)
            .build();

    return restAdapter.create(clazz);
}

public static String getBaseUrl() {
    return BASE_URL;
}}

interface publique ApiInterface {

@GET("repos/{org}/{repo}/issues")
Observable<List<Issue>> getIssues(@Path("org") String organisation,
                                  @Path("repo") String repositoryName,
                                  @Query("page") int pageNumber);}

Notez que getRepos () renvoie un objet Observable et pas seulement une liste de problèmes.

Définir les modèles

Un exemple pour cela est montré. Vous pouvez utiliser des services gratuits comme JsonSchema2Pojo ou ceci.

public class Comment {

@SerializedName("url")
@Expose
private String url;
@SerializedName("html_url")
@Expose
private String htmlUrl;

//Getters and Setters
}

Créer une instance de modification

ApiInterface apiService = ApiClient.getInstance().create(ApiInterface.class);

Ensuite, utilisez cette instance pour extraire des données du serveur

Observable<List<Issue>> issueObservable = apiService.getIssues(org, repo,                 pageNumber);
    issueObservable.subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .map(issues -> issues)    //get issues and map to issues list
            .subscribe(new Subscriber<List<Issue>>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG, "onCompleted: COMPLETED!");
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, "onError: ", e);
                }

                @Override
                public void onNext(List<Issue> issues) {
                    recyclerView.setAdapter(new IssueAdapter(MainActivity.this, issues, apiService));
                }
            });

Vous avez maintenant récupéré avec succès des données à partir d'un serveur à l'aide de Retrofit et de RxJava.