~
~
一、关于Retrofit初始化
Retrofit1.0和Retrofit2.0在初始化上有一些细微的变化,我们先来看下代码
Retrofit1.0
public static CustomApiInterface getCustomApiClient(Class<?> mClass, boolean isCache) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setErrorHandler(retrofitErrorHandler)
.setEndpoint(URLs.ROOT_URL)
.setRequestInterceptor(requestInterceptor)
.setConverter(new ApiConverter(mClass))
// 是否缓存本次请求
.setClient(new CachingClient(isCache))
.build();
mServiceApi = restAdapter.create(CustomApiInterface.class);
return customApiInterface;
mServiceApi = restAdapter.create(CustomApiInterface.class);return customApiInterface;
Retrofit2.0
@Inject
public RestDataSource() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient().newBuilder().addInterceptor(loggingInterceptor).build();
Retrofit AdapterApi = new Retrofit.Builder().baseUrl(ServiceApi.END_POINT)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(client)
.build();
mServiceApi = AdapterApi.create(ServiceApi.class);
}
1.可以明显的看到在Retrofit1.0中RestAdapter到2.0中名称直接改为Retrofit,这样从名称来看显得更直观了。
2.1.0中setEndponit到2.0改为baseUrl。
3.设置Interceptro(拦截器)这点改动比较大,在1.0中是直接设置的,而在2.0中需要先设置网络客户端,然后在网络客户端中设置Interceptro。这点改动主要原因是,1.0的时候
Retrofit可以设置其他网络客户端,而到了2.0直接将okhttp设置为默认网络客户端,所以设置拦截器的步骤就在okhttp中了。
4.addCallAdapterFactory(RxJavaCallAdapterFactory.create())表示支持RxJava。
二、关于RxJava的Schedulers(调度器)
我们知道Rxjava引入了Schedulers的概念,通过Schedulers可以调度线程,这样大大方便了我们多线程开发。比如我们用Retrofit+Rxjava生成一个网络接口时,可以这样做
@Override
public Observable<BannerWrapper> execute() {
return mRepository.getBanners(mType).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
可以从代码中看出,出现了这两个方法subscribeOn(Schedulers.io) 、observeOn(AndroidSchedulers.mainThread())。第一个方法表示被观察者在产生信息时所在的线程,第二个方法表示订阅者在订阅后消费信息时所在的线程。这两个方法就是Rxjava的最基本线程调度功能,请求数据的时候在io线程,数据请求成功后在AndroidUi线程更新界面,这样是不是比起以前的开启一个新线程请求接口,然后写一个回调到ui线程的接口方便很多呢。
然后在实际使用中还是有些小细节需要处理,比如在请求网络接口时,在准备阶段我们会show一个Progress表示网络等待,但是使用subscribeOn(Schedulers.io())后把整个准备阶段都纳入了io线程,但是我们showProgerss需要在UI线程,如果直接showProgerss会导致线程非法,所以这里需要用到Observable.doOnSubscribe(),doOnSubscribe()中的动作执行在subscribe()发生的线程中,而如果doOnSubscribe()之后又subscribeOn()的话,doOnSubscribe将执行在离它最近的subscribeOn()指定的线程中,所以我们可以这样改动一下代码。
@Override
public Observable<BannerWrapper> execute() {
return mRepository.getBanners(mType).subscribeOn(Schedulers.io()).doOnSubscribe(new Action0() {
@Override
public void call() {
// showProgerss();
}
}).subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread());
}
至此就达到了在准备阶段showProgerss的功能。
Retrofit2.0
@Inject public RestDataSource() { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient().newBuilder().addInterceptor(loggingInterceptor).build(); Retrofit AdapterApi = new Retrofit.Builder().baseUrl(ServiceApi.END_POINT) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()).client(client) .build(); mServiceApi = AdapterApi.create(ServiceApi.class); }
1.可以明显的看到在Retrofit1.0中RestAdapter到2.0中名称直接改为Retrofit,这样从名称来看显得更直观了。
2.1.0中setEndponit到2.0改为baseUrl。
3.设置Interceptro(拦截器)这点改动比较大,在1.0中是直接设置的,而在2.0中需要先设置网络客户端,然后在网络客户端中设置Interceptro。这点改动主要原因是,1.0的时候
Retrofit可以设置其他网络客户端,而到了2.0直接将okhttp设置为默认网络客户端,所以设置拦截器的步骤就在okhttp中了。
4.addCallAdapterFactory(RxJavaCallAdapterFactory.create())表示支持RxJava。
@Override public Observable<BannerWrapper> execute() { return mRepository.getBanners(mType).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); }
@Override public Observable<BannerWrapper> execute() { return mRepository.getBanners(mType).subscribeOn(Schedulers.io()).doOnSubscribe(new Action0() { @Override public void call() { // showProgerss(); } }).subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()); }