既然使用了Retrofit ,那么不去使用一下它的RxJava总觉得心有不甘。Ok,既然有了目标,那么就要去实现它!
Step 1
首先当然去compile需要的类库了。Retrofit要结合Rxjava需要以下的类库:
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
这里需要注意一点,retrofit的版本要和retrofit对应的adapter-rxjava版本一致,否则,会有意想不到的bug出现。本人就遇到了用beta1的adapter和beta2的retrofit,很正常的,它挂了,说我没有实现抽象类的方法。此处略过几百字的幽怨。。。
Step 2
接着我们要创建对应的ApiServices:
@POST("toh")
Observable<ResponseListEvent> loadListInofsWithRx(@Query("v") String v,@Query("key") String key,@Query("month") int month,@Query("day") int day);
创建对应的RESTClient也是需要修改的,需要创建对应的retrofit对象。
private static final Retrofit sRetrofit_rx = new Retrofit.Builder()
.baseUrl(DEFAULT_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
调用方法:
public static Observable<ResponseListEvent> queryListEvent(final RequestListEventParams params){
return sHttpService_rx.loadListInofsWithRx(params.v,params.key,params.month,params.day);
}
使用方法:
RequestListEventParams params = RESTParamsBuilder.buildRequestListEventParams(mCurrentMonth, mCurrentDay);
RESTClient.queryListEvent(params)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.newThread())
.map(new Func1<ResponseListEvent, List<CustomEvent>>() {
@Override
public List<CustomEvent> call(ResponseListEvent responseListEvent) {
CustomEvent[] result = responseListEvent.getResult();
return Arrays.asList(result);
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<CustomEvent>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(List<CustomEvent> customEvents) {
mAdapter.refresh(customEvents);
}
});
对结构框架不太清楚的请看利用Retrofit创建自己的网络框架
全文结束,跟多衍生的还是需要深入的研究RxJava和Retrofit。