rxjava2.0和retrofitt和rxjava该不该封装

RxJava+Retrofit,在联网返回后如何先进行统一的判断? - 知乎192被浏览<strong class="NumberBoard-itemValue" title="1分享邀请回答mApiService.getUserInfo(params...).compose(ApiWrapper::warp)
.subscribe(data -& {...}, error -& {...})
//以下是原回答本回答在@的回答的基础上进行了改进刚开始学着用RxJava,今天也遇到了同样的问题之前的解决方案参考了@的回答但我这边的需求要复杂些,除了做同楼主一样的处理,还需要接一些其它的处理(map, filter)什么的,这样的话每次新增一个api,都要在apiWrapper和ApiService里面添加两个几乎一样方法,而且要在wrapper的方法里copy一串一摸一样的处理代码,看起来像这样:Observable&User& getUserInfo() {
return mApi.getUserInfo
.flatMap(RetroUtil::flatResult)
.map(RetroUtil::mapResult)
.map(RetroUtil::mapResult2)
.flatMap(RetroUtil::flatResult2);
Observable&User& getUserInfo(String id) {
return mApi.getUserInfo(id)
.flatMap(RetroUtil::flatResult)
.map(RetroUtil::mapResult)
.map(RetroUtil::mapResult2)
.flatMap(RetroUtil::flatResult2);
Observable&User& getUserInfo(String id, String token) {
return mApi.getUserInfo(id, token)
.flatMap(RetroUtil::flatResult)
.map(RetroUtil::mapResult)
.map(RetroUtil::mapResult2)
.flatMap(RetroUtil::flatResult2);
这样产生了不少重复劳动,而且看起来不够优雅,经过改进,wrapper类精简到了对外只暴露一个wrap方法,针对不同的参数个数有几个类似的多态函数,代码如下:public static &R, P1, P2, P3, P4& Observable&R& wrap(P1 p1, P2 p2, P3 p3, P4 p4, Func4&P1, P2, P3, P4, Observable&ResponseBean&R&&& func) {
return wrap(func.call(p1, p2, p3, p4));
public static &R, P1, P2, P3& Observable&R& wrap(P1 p1, P2 p2, P3 p3, Func3&P1, P2, P3, Observable&ResponseBean&R&&& func) {
return wrap(func.call(p1, p2, p3));
public static &R, P1, P2& Observable&R& wrap(P1 p1, P2 p2, Func2&P1, P2, Observable&ResponseBean&R&&& func) {
return wrap(func.call(p1, p2));
public static &R, P1& Observable&R& wrap(P1 p1, Func1&P1, Observable&ResponseBean&R&&& func) {
return wrap(func.call(p1));
public static &R& Observable&R& wrap(Func0&Observable&ResponseBean&R&&& func) {
return wrap(func.call());
public static &R& Observable&R& wrap(Observable&ResponseBean&R&& result) {
return result.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(RetroUtil::flatResult)
.map(RetroUtil::mapResult)
.map(RetroUtil::mapResult2)
.flatMap(RetroUtil::flatResult2);
这样在外部调用时,只需要:ApiWrapper.wrap(param1, param2, mApiService::method)
.subscribe(data -& {...}, error -& {...})
ApiWrapper.wrap(mApiService.getUserInfo(params...))
.subscribe(data -& {...}, error -& {...})
这样新增api的时候,只需要在ApiService同往常一样添加一个方法,而不必在ApiWrapper里面copy代码101 条评论分享收藏感谢收起class Result&T& {
String ResultMessage;
int ResultCode;
2. 处理错误的方法和
前辈方法差不多,放到作为静态方法放到 RetroUtil 里,这里 ApiException 为自己定义的一个异常,放入错误码和错误信息(错误码不止一个):static &T& Observable&T& flatResult(Result&T& result) {
return Observable.create(subscriber -& {
switch (result.ResultCode) {
case Constants.SUCCESS_CODE:
subscriber.onNext(result.Data);
case Constants.ERROR_CODE:
subscriber.onError(new ApiException(result.ResultCode, result.ResultMessage);
subscriber.onCompleted();
3. 在 API 包装类对于上述 Result&T& 格式的返回结果,统一调用 flatMap(RetroUtil::flatResult) 后的 API。这样每个 API 的返回结果就是 Observable&Data& 的形式并且在 errorHandler 中统一处理错误了。// 接口方法
Observable&Result&User&& getUserInfo();
// 包装后的方法
Observable&User& getUserInfo() {
return mApi.getUserInfo.flatMap(RetroUtil::flatResult);
apiWrapper.getUserInfo()
.subscrible(user -& {
// 处理正常逻辑
}, error -& {
// 处理错误逻辑和异常,这里封装时通常也会统一处理,
// 提供一个默认的 Action1&Throwable& 参数,弹出
// throwable 的 message 打印日志等
212 条评论分享收藏感谢收起这是一个使用rxjava,retrofit封装的网络框架
这是一个使用rxjava,retrofit封装的网络框架
Knowledge is power.没有更多推荐了,
不良信息举报
举报内容:
对Rxjava和Retrofit的一次封装使用
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!尊敬的极客用户,您好!
感谢您一直关注并使用极客头条,为了给您带来良好的体验效果及性能,极客头条将于日关闭,您可以在
中继续使用发布文章功能并看到已经发布成功的文章。
主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》研发主编,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:www.xttblog.com。个人QQ群:、
个人大数据技术博客:https://www.iteblog.comrxjava+okhttp+retrofit一起使用的问题? - 知乎28被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答github.com/lsxiao/ZhihuDailyFluxRRD210 条评论分享收藏感谢收起42 条评论分享收藏感谢收起写回答

我要回帖

更多关于 rxjava retrofit 的文章

 

随机推荐