package com.tutosandroidfrance.RetrofitSample; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v7.app.ActionBarActivity; import android.widget.TextView; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import retrofit.Callback; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.android.AndroidLog; import retrofit.client.Response; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.functions.Func2; import rx.schedulers.Schedulers; public class MainActivity extends ActionBarActivity { GithubService githubService; TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); githubService = new RestAdapter.Builder() .setEndpoint(GithubService.ENDPOINT) .setLog(new AndroidLog("retrofit")) .setLogLevel(RestAdapter.LogLevel.FULL) .build() .create(GithubService.class); getListRepos(); } private void getListRepos() { githubService.listRepos("florent37") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) //on commence par couper notre observable de List<Repo> en observable de Repo .flatMap(new Func1<List<Repo>, Observable<Repo>>() { @Override public Observable<Repo> call(List<Repo> repos) { return Observable.from(repos); } }) //afin de récupérer le nom de chaque repo, nous aurons donc des Observable<String> .map(new Func1<Repo, String>() { @Override public String call(Repo repo) { return repo.getName(); } }) //on trie nos Observable<String> .toSortedList(new Func2<String, String, Integer>() { @Override public Integer call(String s, String s2) { return s.compareTo(s2); } }) //on coupe l'observable de List<String> en Observable<String> .flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> strings) { return Observable.from(strings); } }) //afin d'accéder à la méthode reduce, permettant de réduire nos noms, de la forme nom1 \n nom2 .reduce(new Func2<String, String, String>() { @Override public String call(String s, String s2) { return s + "\n" + s2; } }) //on obtient à la fin un String contenant la liste de nos noms de repo, que l'on va afficher .subscribe(new Action1<String>() { @Override public void call(String s) { textView.setText(s); } }); } private void getListReposWithoutRX() { githubService.listRepos("florent37", new Callback<List<Repo>>() { @Override public void success(List<Repo> repos, Response response) { //.subscribeOn(Schedulers.io()) new Handler().post(new Runnable() { @Override public void run() { //.map > String List<String> reposNames = new ArrayList<String>(); for (Repo repo : repos) reposNames.add(repo.getName()); //.toSortedList Collections.sort(reposNames, new Comparator<String>() { @Override public int compare(String s, String s2) { return s.compareTo(s2); } }); //.reduce final StringBuffer concat = new StringBuffer(); for (String repoName : reposNames) concat.append(repoName).append("\n"); //.observeOn(AndroidSchedulers.mainThread()) new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { textView.setText(concat); } }); } }); } @Override public void failure(RetrofitError error) { } }); } }