解决Retrofit和RxJava 抛出异常报错问题

package com.dingtao.rrmmp.core.exception;public class ApiException extends Exception {private int code;private String displayMessage;public ApiException(int code, String displayMessage) {this.code = code;this.displayMessage = displayMessage;}public ApiException(int code, String message, String displayMessage) {super(message);this.code = code;this.displayMessage = displayMessage;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getDisplayMessage() {return displayMessage;}public void setDisplayMessage(String displayMessage) {this.displayMessage = displayMessage;}
}
package com.dingtao.rrmmp.core.exception;import android.net.ParseException;import com.google.gson.JsonParseException;import org.json.JSONException;import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;public class CustomException {/*** 未知错误*/public static final int UNKNOWN = 1000;/*** 解析错误*/public static final int PARSE_ERROR = 1001;/*** 网络错误*/public static final int NETWORK_ERROR = 1002;/*** 协议错误*/public static final int HTTP_ERROR = 1003;public static ApiException handleException(Throwable e) {e.printStackTrace();ApiException ex;if (e instanceof JsonParseException|| e instanceof JSONException|| e instanceof ParseException) {//解析错误ex = new ApiException(PARSE_ERROR, e.getMessage());return ex;} else if (e instanceof ConnectException) {//网络错误ex = new ApiException(NETWORK_ERROR, e.getMessage());return ex;} else if (e instanceof UnknownHostException || e instanceof SocketTimeoutException) {//连接错误ex = new ApiException(NETWORK_ERROR, e.getMessage());return ex;} else {//未知错误ex = new ApiException(UNKNOWN, e.getMessage());return ex;}}
}
package com.example.shopping_lx.core.exception;import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.functions.Function;
import retrofit2.Response;public class ResponseTransformer {public static <T> ObservableTransformer<T, T> handleResult() {return  new ObservableTransformer<T, T>() {@Overridepublic ObservableSource<T> apply(Observable<T> upstream) {return upstream.onErrorResumeNext(new ErrorResumeFunction<T>()).flatMap(new ResponseFunction<T>());}};}/*** 非服务器产生的异常,比如本地无无网络请求,Json数据解析错误等等。** @param <T>*/private static class ErrorResumeFunction<T> implements Function<Throwable, ObservableSource<T>> {@Overridepublic ObservableSource<T> apply(Throwable throwable) throws Exception {return Observable.error(throwable);}}/*** 服务其返回的数据解析* 正常服务器返回数据和服务器可能返回的exception** @param <T>*/private static class ResponseFunction<T> implements Function<T, ObservableSource<T>> {@Overridepublic ObservableSource<T> apply(T tResponse) throws Exception {return Observable.just(tResponse);}}
}
public interface DataCall<T> {void success(T data);void fail(ApiException e);}
package com.dingtao.rrmmp.presenter;import com.dingtao.rrmmp.bean.Result;
import com.dingtao.rrmmp.core.DataCall;
import com.dingtao.rrmmp.core.exception.ApiException;
import com.dingtao.rrmmp.core.exception.CustomException;
import com.dingtao.rrmmp.core.exception.ResponseTransformer;
import com.dingtao.rrmmp.util.UIUtils;import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;/*** @author dingtao* @date 2018/12/28 11:30* qq:1940870847*/
public abstract class BasePresenter {private DataCall dataCall;public BasePresenter(DataCall dataCall) {this.dataCall = dataCall;}protected abstract Observable observable(Object... args);public void reqeust(Object... args) {observable(args).compose(ResponseTransformer.handleResult()).compose(new ObservableTransformer() {@Overridepublic ObservableSource apply(Observable upstream) {return upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());}})
//                .subscribeOn(Schedulers.newThread())//将请求调度到子线程上
//                .observeOn(AndroidSchedulers.mainThread())//观察响应结果,把响应结果调度到主线程中处理.subscribe(new Consumer<Result>() {@Overridepublic void accept(Result result) throws Exception {dataCall.success(result);}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {// 处理异常
//                        UIUtils.showToastSafe("请求失败");dataCall.fail(CustomException.handleException(throwable));}});}public void unBind() {dataCall = null;}
}

解决Retrofit和RxJava 抛出异常报错问题相关推荐

  1. 解决CPC撰写文档报错问题“无法获取“AxforApplication”控件的窗口句柄。不支持无窗口的 ActiveX 控件”

    解决CPC撰写文档报错问题"无法获取"AxforApplication"控件的窗口句柄.不支持无窗口的 ActiveX 控件" 参考文章: (1)解决CPC撰写 ...

  2. Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下: Syntax error on token &quo ...

  3. 解决IntelliJ IDEA下Maven报错Unknown lifecycle phase “.test.skip=true“. You must specify a valid lifecycle

    解决IntelliJ IDEA下Maven报错Unknown lifecycle phase ".test.skip=true". You must specify a valid ...

  4. 解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener

    解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener   笔者在做代 ...

  5. 解决 Tomcat 添加 Cookie 域名报错问题 : CookieProcessor

    From: https://blog.csdn.net/liqing0013/article/details/86489802 解决 Tomcat 添加 Cookie 域名报错问题 : CookieP ...

  6. python无法安装第三方库read time out_解决pip install的时候报错timed out的问题

    安装包的时候报错,执行:pip install pyinstaller 问题: File "c:\python\python35\lib\site-packages\pip\_vendor\ ...

  7. 安装python37路径报错_解决pycharm安装python库报错问题

    最近在玩微信图灵机器人,不过我安装有一些库,安装报错,上网找了很久,总结有两种方法,记录一下 方法一: 手动安装,直接到官网你需要的python库下载到本地, 放在安装python路径,C:\User ...

  8. 【unity】解决 2d-extras 的 CustomRuleTileMenu 脚本报错的问题

    [unity]解决 2d-extras 的 CustomRuleTileMenu 脚本报错的问题 参考文章: (1)[unity]解决 2d-extras 的 CustomRuleTileMenu 脚 ...

  9. 【问题待解决】自定义控件设计界面报错,编译运行正常

    [问题待解决]自定义控件设计界面报错,编译运行正常 参考文章: (1)[问题待解决]自定义控件设计界面报错,编译运行正常 (2)https://www.cnblogs.com/cnDqf/p/4171 ...

最新文章

  1. 在线作图|2分钟画一张堆叠面积图
  2. 英语口语智能测试软件,口语易英语口语智能评测训系统 官方版v7.9
  3. Windows Defender还原误删文件
  4. ubuntu运行docker报错:invalid mount config for type “bind“: field Source must not be empty.(没解决)
  5. 十位数和个位数交换python_Python实现100以内十位数数字比个位数数字小的数
  6. html超链接打开共享文件夹,教你如何访问共享文件夹
  7. GWT MVP变得简单
  8. 估值150亿,账上还有近10亿现金,却减员500人,这家公司CEO的说法你认同吗?...
  9. MyBatis 批量插入与更新、核心配置文件 mybatis-config.xml
  10. 8种Python文本处理工具集
  11. 用php打竖的文字_总结PHP竖排文字的方法
  12. 基于微信校园跑腿小程序毕业设计设计与实现毕设参考
  13. Linguistic Regularities in Continuous Space Word Representations
  14. 6月3日至5日 服务器信息维修,2015年6月3日维护公告
  15. 恕我直言!千万别随便叫一个程序员为“码农”
  16. 你可以不知道六六,但你必须知道当红电视剧《蜗居》
  17. 第一个python自动化脚本
  18. [Unity]Mac调用SVN更新
  19. 工程导论-----工程,技术与工程师
  20. mybatis由浅入深day02_4多对多查询_多对多查询总结

热门文章

  1. ID card No.
  2. [转载]C++经典书籍汇总
  3. ZBrush: Alpha纹理生成雕花
  4. EEROM和FRAM写入速度比较
  5. DuerOS智能设备激活数突破1亿 小度购物节再掀热潮
  6. MariaDB glare cluster简介
  7. CAD转PDF软件简单便捷的免费
  8. Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能
  9. 第四届橙瓜网络文学奖二次元分类目前评分前四名竟然脑洞这么大?
  10. Android接入微信登陆