之前记录过。就是我们的页面如果退出了,然后虽然取消了dispose(),但是抛出的异常后续无法接收(此时后台线程仍在跑,可能会抛出IO等异常)。所以我们可以设置全局异常捕获来获取:
import io.reactivex.functions.Consumer;
import io.reactivex.plugins.RxJavaPlugins;
import okhttp3.OkHttpClient;
/**
* RxJava2 当取消订阅后(dispose()),
* RxJava 抛出的异常后续无法接收(此时后台线程仍在跑,可能会抛出IO等异常),
* 全部由 RxJavaPlugin 接收,需要提前设置 ErrorHandler.
*/
private void setRxJavaErrorHandler() {
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
// throwable.printStackTrace();
if (null != throwable)
Log.e("MyApplication", "MyApplication setRxJavaErrorHandler " + throwable.getMessage());
}
});
}
使用: Application里面调用

但是后面我发现如果是空指针异常的话,我这边给拦截了,但是由于我是转圈圈的,所以我们的转圈圈就没有获取异常,也就没有消失? 这里我就改成使用者自己捕获,也就是自定义Observer,里面做处理:
import io.reactivex.Observer;
/**
* Created by hl on 2018/7/4.
* 1\. 增加具体错误处理回调 - 给需要使用的地方(比如没有重试处理界面的地方)
*/
public abstract class BaseObserver<T> implements Observer<T> {
private BaseView baseView;
private BaseObserver() {
}
public BaseObserver(BaseView baseView) {
this.baseView = baseView;
}
@Override
public void onNext(T t) {
try {
onSuccess(t);
} catch (Exception e) {
onError(e);
}
}
@Override
public void onError(Throwable e) {
///< 自定义转换处理下相关信息
onErrors(ExceptionHandle.handleException(e));
}
public abstract void onSuccess(T t);
public abstract void onErrors(ExceptionHandle.ResponeThrowable responeThrowable);
}
/**
* View负责显示数据,被Presenter调用来设置界面,可以是Activity, Fragment,或者View, Dialog
* Created by hl on 2018/3/13.
*/
public interface BaseView {
/**
* 共有的一些UI操作,比如吐司,进度条显示,消失等
*/
void showDialog();
void disDialog();
void retryDialog();
void emptyDialog();
void showToast(String msg);
void showRunToast(String msg);
/**
* 账号过期时回调
* @param _dataModelclass
* @param object
*/
void onLoinOut(Class _dataModelclass, Object object);
/**
* 第三方登录的时候,如果未绑定账号,会有这个回调
* @param _dataModelclass
* @param code
*/
void onThirdBind(Class _dataModelclass, int code);
}
之前没有try,catch,所以有些异常程序直接崩溃了。。这里就不会直接崩溃,还能提示错误信息!
使用:相当于就直接用我们自己的onSuccess和onErrors了。。。
.subscribe(new BaseObserver<D>(refreshView) {
@Override
public void onComplete() {
///< 如果是刷新才调用刷新结束接口
if (_bIsRefresh) {
if (1 == _pageNum || -1 == _pageNum) {
refreshViewD.finishRefresh();
} else {
refreshViewD.finishLoadMore();
}
}
}
@Override
public void onErrors(ExceptionHandle.ResponeThrowable responeThrowable) {
///< 接下来就可以根据状态码进行处理...
int statusCode = responeThrowable.code;
switch (statusCode) {
case ExceptionHandle.ERROR.TOKEN:
refreshViewD.onLoinOut(_dataModelclass, new Object[]{statusCode, responeThrowable.message});
refreshViewD.showToast("你的账号异常,请重新登录,谢谢!");
break;
default:
if (responeThrowable.message.contains("on a null object")){
refreshViewD.showToast("数据空异常!");
} else {
refreshViewD.showToast(responeThrowable.message);
}
break;
}
if (!_bIsRefresh) {
refreshViewD.retryDialog();
} else {
refreshViewD.onRequestFailer();
}
onComplete();
// 清除当前请求标识
clearRequestFlag(_dataModelclass);
}
@Override
public void onSubscribe(Disposable d) {
subscriptionList.add(d);
}
@Override
public void onSuccess(D dataList) {
if (1 == _pageNum) {
refreshViewD.resetItemList();
refreshViewD.<D>onSucess(_dataModelclass, dataList);
} else {
refreshViewD.<D>onSucess(_dataModelclass, dataList);
}
if (!_bIsRefresh) {
refreshViewD.disDialog();
}
// 清除当前请求标识
clearRequestFlag(_dataModelclass);
}
});
先这样。我再想能不能同时全局和局部?。。。。关于Rx使用深入之前有文章。但是源码还没怎么看过...┭┮﹏┭┮....
网友评论