为什么改进
- 简化代码的开发和方便业务逻辑的梳理(阐述项目中现在代码的使用情况)
在项目中,请求网络的回调有多个方法需要处理,而在项目中,有些回调方法在有些情况下是不需要处理的,接口分离原则,不同的情况通过不同的接口实现,这样也方便使用lambda表达式简写。
下面两块代码是项目中的使用的情况
//这里的callback作用是用来处理请求网络完成后的回调实例。
OkHttpUtils.ResultCallback<String> callback = new OkHttpUtils.ResultCallback<String>() {
@Override
public void onSuccess(String response) {
// TODO 转换成需要的对象,每一次请求回来的数据都要这样转换一次,才能拿到需要的对象。在这次的改造中,就是把这个工作交给网络请求的工具内部自动完成。
GetAdvListBean getAdvListBean = getGson().fromJson(response, GetAdvListBean.class);
if (200 == getAdvListBean.getResult()) {
//TODO 成功的时候,需要做的处理
}
pullToRefreshView.refreshComplete();
}
@Override
public void onFailure(Request request, Exception e) {
// TODO 服务器失败的时候,需要做的处理
}
};
需要处理多个处理多个结果的情况:
private void requestAccountInfo() {
//这是一个请求网络的回调实例。
OkHttpUtils.ResultCallback<String> callback = new OkHttpUtils.ResultCallback<String>() {
@Override
public void onSuccess(String response) {
//转换成对应的对象,每次都要转换的;
accountInfo = getGson().fromJson(response, GetMyAccountInfoBean.class);
if (200 == accountInfo.getResult()) {
//服务器返回的code等于200 的时候需要做的处理
} else if (300 == accountInfo.getResult()) {
// 服务器返回code为300时,需要做的处理。
} else if (400 == accountInfo.getResult()) {
//服务器返回的Code等于400的时候,要做的处理。
}
}
}
@Override
public void onFailure(Request request, Exception e) {
// 请求网络失败的回到方法
}
};
}
小结:在上面的代码中,我们有些地方需要处理200,300,400,等多种的情况;那么在需要用到的地方,都需要些上面的代码进行判断。
改进的目标
我需要处理200的情况,我就传ISuccess接口,如果需要处理网络异常,我就传递INetWork接口,我不需要处理的情况我就不传递对应的参数。
OkHttpUtils.post(Constants.userSign, paramsList, new ISuccess<UserSignBean>() {
@Override
public void success(UserSignBean response) {
//只需要处理code等于200的情况
}
});
需要处理多个情况:
OkHttpUtils.post(Constants.getNoticeList, params, new ISuccess<NoticeResponse>() {
@Override
public void success(NoticeResponse response) {
//处理成功的情况
}, (msg) -> {
// 处理服务器数据状态非200的情况
pullToRefreshView.refreshComplete();
}, () -> {
// 处理网络请求失败的情况
pullToRefreshView.refreshComplete();
});
使用到的技术:
- 使用lambda表达式简化代码(lambda表达式是什么?)
接口中只有一个方法时,可以使用lambad表达式简写。 - 什么是泛型:是一个约束类型安全的语法糖。(只在编译时)
- 什么是Gson:是一个将符合Json格式的String 字符串转换成javaBean对象。
class Person {
public String name;
public String age;
}
Person person = new Gson().fromJson(str, Person.class);
小结:在这个功能的改进中,我做的主要工作是熟悉这三个工具的特点,对他们进
行了一次整合。达到了简化代码的目的。(在这里利用了他们什么特点进行阐述)
实现步骤
- 通过传递的成功接口中,获取传递的泛型类型;
- 然后更具泛型类型进行比较,
- 如果是String类型,那么直接将结果作为参数传递回去
- 如果是非String 类型,那么将返回的String 字符串转换成对应的Bean对象。然后作为方法参数传递回去。
private void delivery(Request request, final ISuccess listener0, final IService listener1, final INetWork listener2) {
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
noNetwork(listener2);
}
@Override
public void onResponse(Response response) throws IOException {
try {
Type[] types = listener0.getClass().getGenericInterfaces();
ParameterizedType parameterized = (ParameterizedType) types[0];
Class<T> clazz = (Class<T>) parameterized.getActualTypeArguments()[0];
String str = response.body().string();
//传递的泛型是String的时候,直接将数据丢出去
if (clazz == String.class) {
T t = (T) str;
onSuccess(listener0, t);
} else {
T t = getGson().fromJson(str, clazz);
if (t == null) {
onServiceError(listener1, "服务器错误");
} else {
// 如果返回的数据解析成功,那么判断返回的code
BaseEntity br = (BaseEntity) t;
if (br.getResult() != 200) {
// 返回code不是200的时候,调用如下方法
onServiceError(listener1, br.getResultMsg());
} else {
//200的时候做如下处理
onSuccess(listener0, t);
}
}
}
} catch (Exception e) {
noNetwork(listener2);
}
}
});
}
实现的结果
/**
* 验证登录状态
*
* @param token
*/
private void checkToken(String token) {
List<Param> paramsList = new ArrayList<>();
Param tokenValue = new Param("token", token);
paramsList.add(tokenValue);
OkHttpUtils.post(Constants.checkToken, paramsList, new ISuccess<BaseEntity>() {
@Override
public void success(BaseEntity response) {
//处理成功的请求
}, (String errMsg) -> {
// 处理服务器code不等于200的情况
LoginUtils.toLogin(mActivity);
}
);
}
//注:在这里,不需要处理网络情况失败的情况,所以不需要实现第三个回调方法
遇到的问题
- 想要得到的效果:
(msg) -> {
pullToRefreshView.refreshComplete();
}
- 实际得到的效果:
new ISuccess<NoticeResponse>() {
@Override
public void success(NoticeResponse response) {
// 处理服务器数据成功的情况
}
}
//注:在这里,想要达到上面的效果,但是如果写成上面的效果,那么就不能传递
泛型进去,不传递泛型进去,在转换的地方就不能正常的执行;这个冲突暂时不知道怎么解决。
网友评论