记网络请求错误回调的处理
最近自己封装了个网络请求(RX+RETROFIT),也是遇到了很多的坑,天天都搞的焦头烂额的。就在前两天突然觉得我网络请求的错误回调处理不行
/**
* 各种网络错误的回调
* @param e
*/
public void onRequestException(Exception e) {
if (e instanceof ApiException) {
//处理各种网络错误 比如需要登陆
if (((ApiException) e).getType() == ApiException.NEED_LOGIN) {
//处理需要登陆的错误
}
}
}
这个方法写在BaseActivity里面,在服务器返回错误的时候会调用这个方法。
例如:处理需要登陆的错误的时候就需要在if里面写上需要登陆的逻辑代码,问题出来了LoginActivity是在app主工程里,而BaseActivity确实在依赖包lib里面,所以需要登陆的逻辑代码必然要用到java的反射来调用LoginActivity相关的方法,想法确实是可行的,但问题是我不想通过反射来写代码,就觉得不好看,所以我要改改。
想要不用反射,我当时便想到了两种方法。
1.在app主工程里面再写一个Activity的基类并且继承BaseActivity,然后重写 onRequestException 方法,重新判断逻辑。这样就可以实现在主工程里面调用LoginActivity相关方法,不用通过java反射写了。问题在于我项目写了很多了 不想改动(完全是借口,我只是想试试第二种方法)
2.首先在依赖包lib里面创建一个IRequestException的接口
public interface IRequestException {
/**
* 写登陆逻辑
*
* @param activity
*/
public void login(Activity activity);
}
然后再BaseActivity里面这样写
protected IRequestException requestException;
/**
* 各种网络错误的回调
*
* @param e
*/
public void onRequestException(Exception e) {
if (e instanceof ApiException) {
requestException = IRequestException.getInstance();//这里只是获取一个实例 用什么方法都可以只要能达成目的
//处理各种网络错误 比如需要登陆
if (((ApiException) e).getType() == ApiException.NEED_LOGIN) {
//处理需要登陆的错误
requestException.login(activity);//调用登陆方法
}
}
}
重点来了 我们需要在app里面创建一个类(RequestException)实现IRequestException接口
public class RequestException implements IRequestException {
@Override
public void login(Activity activity) {
//写LoginActivity的相关逻辑代码
Intent it = new Intent(activity,LoginActivity.class);
startActivity(it);
}
}
然后再app里面实例化RequestException 比如我在BaseApplication里面初始化
public abstract class BaseApplication extends Application {
public static BaseApplication app = null;
protected IRequestException requestException;
public static BaseApplication getInstance() {
return app;
}
@Override
public void onCreate() {
super.onCreate();
app = this;
requestException = newRequestException();
}
public IRequestException getRequestException() {
return requestException;
}
/**
* 这个方法是重点 BaseApplication 的子类实现newRequestException 给IRequestException new 一个实例
*/
public abstract IRequestException newRequestException();
}
然后我需要在app里创建一个application的类并且继承BaseApplition实现newRequestException 方法
public class App extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IRequestException newRequestException() {
return new RequestException();
}
}
准备都做完了,现在需要在BaseActivity里面调用onRequestException方法了
/**
* 各种网络错误的回调
*
* @param e
*/
public void onRequestException(Exception e) {
if (e instanceof ApiException) {
// requestException = IRequestException.getInstance();//这里只是获取一个实例 用什么方法都可以只要能达成目的
//处理各种网络错误 比如需要登陆
if (((ApiException) e).getType() == ApiException.NEED_LOGIN) {
//处理需要登陆的错误
// requestException.login(activity);
BaseApplication.getInstance().getRequestException().login(activity);
}
}
}
大功告成! 我想之后也一定会遇到差不多的情况 留个纪念 到时候好解决