上一篇我们进行了初步封装的总结,同时针对分页列表的请求做了简单的调用请求处理。这篇我们接着调用BaseControlPresenter的requestData方法获取数据【对象】 - 非列表的方式。
1. 创建服务
private BaseControlContract.Presenter presenter;
///< 创建请求服务
presenter = new BaseControlPresenter(this, new BaseControlPresenter.DataHandler() {
@Override
public String String2Data(String strData) {
return strData;
}
});
2. 发起请求
///< 获取钱包地址
presenter.requestData("eth-addr", null);
///< 领取糖果
HashMap paramsList = new HashMap<>();
paramsList.put("id", candyId + "");
paramsList.put("eth_address", walletAddr.getText().toString().trim());
presenter.requestData("receive-candy-detail", paramsList);
3. 成功回调
@Override
public void onSucess(T t) {
String str = (String) t;
if (str.contains("eth_address")) {
CandyBean.ethAddr ethAddr = JSON.parseObject(str, new TypeReference() {
});
walletAddr.setText(ethAddr.getEth_address());
} else if (str.contains("content") || str.contains("msg")) {
CandyBean.ethSuccess ethSuccess = JSON.parseObject(str, new TypeReference() {
});
walletAddr.setVisibility(View.GONE);
receiveRoot.setVisibility(View.VISIBLE);
successTip.setText(ethSuccess.getMsg());
invationokWv.loadDataWithBaseURL(null, ethSuccess.getContent(), "text/html", "utf-8", null);
}
}
分析一下:
1. 解析返回还是String return strData;
2. 请求参数为null?
3. onSucess(T t)中进行Json处理?
为什么这个感觉有点麻烦,1. 一方面没有提前做Json解析,2. 而且我们之前的方法貌似传null有问题,但是确实这个请求方法没有参数。3. 另外onSuccess中根据返回字符串分别进行了解析,貌似有点麻烦,而且位置也不好,提前处理就好了!
解决:问题2我们修改下我们之前的请求方法的部分代码requestData(...)
问题1和问题3 (目前这样没有问题,但是我还是想把数据解析提前做,放到io线程中进行处理)。为什么onSuccess中我们进行了分别处理,因为这个页面有多个网络请求,而我们的通用请求只有一个回调,再多搞回调感觉也没必要。
但是如果只创建一个服务的情况下,数据解析返回的类型最多只能定义一个:
这样另外一个对象就没办法作为泛型类型了,如下
那小白就想,有没有好点的方式,小白想了下,针对目前的页面来讲:
1. 可以只定义实体类,把两个网络请求json的字段全部包含,然后进行转换;使用时判断某个字段是否为空,进而区分应该取哪些字段。
2. 另外一种就是返回类型修改为Object, 然后onSuccess中instanceof判断是哪个对象类型,进而获取数据进行显示。
拿第二种来看:
///< 创建请求服务
presenter = new BaseControlPresenter