协同使用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. 完整代码
完整代码可以参考这里。