前言
我们在平常开发中都会遇到链式请求的问题,如果使用Volley或Okhttp的异步请求,那么就会有很恐怖的回调地狱(callback hell)的问题。
使用RxJava + retrofit2 可以很好的解决链式请求的问题。
Talk is cheap. Show me the code
server 片段
/**
* 文件上传
* MultipartBody 参数使用方法
* RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
*
* @param file 文件
* @returne
*/
@POST("/file")
@Multipart
Observable<DataResponse<UploadFile>> uploadFile(@Part("file\"; filename=\"file\"") RequestBody file);
/**
* IM - 修改群头像
*
* @param fileName
* @return
*/
@POST("/groups/avatar")
@FormUrlEncoded
Observable<NormalResponse> updateGroupAvator(@Field("groupId") String groupId,
@Field("avatar") String fileName);
两个请求用来完成头像更新(图像上传与更新头像)。很明显的链式请求
model 片段
@Override
public Observable<Void> updateAvator(final String groupId, File file) {
//RequestBody 文件上传的内容
RequestBody rb = RequestBody.create(MediaType.parse("image/*"), file);
return otherServer.uploadFile(rb)
//统一结构报文处理
.map(new ResponseFunc<UploadFile>())
.flatMap(new Func1<UploadFile, Observable<NormalResponse>>() {
@Override
public Observable<NormalResponse> call(UploadFile uploadFile) {
return imServer.updateGroupAvator(groupId, uploadFile.getFileName());
}
})
//观察者所在线程
.observeOn(AndroidSchedulers.mainThread())
//被观察者所在线程
.subscribeOn(Schedulers.io());
//统一格式报文处理
.flatMap(new NormalResponseFunc());
}
flatMap操作符
在链式请求中,最关键的是使用flatMap操作符完成第二步或第N步的请求。flatMap是将当前的Observable转换为一个新的Observable。
线程调度(重点,一般网络请求没有成功都是线程调度做错了)
还有另外一个需要注意的地方就是线程调度。
在Android 中使用RxJava 一定要记得线程调度!
观察者一般是UI线程。
被观察者一般是放在io或其他线程中。
链式调用的线程调度必须放在flatMap之后。
如果设置调度在flatMap之前,就会在subscribe的onError回调中报NetWorkOnMainThread的错,如果你没有做任何处理,不会显示任何错误,也不会报错!所以务必在OnError回调中写一些日志监测代码或者抛出异常!