协同使用Retrofit 2和RxAndroid

  RxAndroid是RxJava在Android上的扩展。在Retrofit 2使用方法举例中,使用了Call<T> 的形式定义接口,此外也可以使用自定义类型如MyCall<T> ,Retrofit通过CallAdapter来适配不同的接口类型。Retrofit 2提供了RxJavaCallAdapterFactory,可以同来适配RxAndroid。

  下面的例子在Retrofit 2使用方法举例的基础上,介绍协同使用Retrofit 2和RxAndroid的方法。

1. 添加RxAndroid和adapter-rxjava

  首先要添加RxAndroid和adapter-rxjava,在bulid.gradle中加入:

dependencies {
    ...
    compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'io.reactivex:rxjava:1.1.0'
}

【完整代码】

2. 修改接口

  将接口修改为Observable<T> 的形式:

@GET("/3/discover/movie")
Observable<MovieResponse> getMovies(@Query("sort_by") String sortBy);

【完整代码】

3. 使用RxJavaCallAdapterFactory

  在创建Retrofit的时候,加入RxJavaCallAdapterFactory:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(httpClient)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build();

【完整代码】

4. 使用RxAndroid

  然后就可以使用RxAndroid了:

MovieService movieService = App.getRestClient().getMovieService();

movieService.getMovies(MovieService.SORT_BY_POPULARITY_DESC)
        .timeout(5, TimeUnit.SECONDS)
        .retry(2)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
                response -> {
                    mMovies = response.getMovies();
                    Log.v(LOG_TAG, "mMovies size = " + mMovies.size());
                    updateListView();
                },
                throwable -> {
                    Toast.makeText(MainActivity.this,
                            throwable.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
                }
        );

【完整代码】

5. 完整代码

  完整代码可以参考这里