android发网络请求工具类
16lz
2021-01-24
android上发起网络请求有很多实现方式,有很多的第三方框架如OKHttp、asynhttp、xutils、andbase等等,选择哪个其实影响不大。但平时经常见到有些开发在activity里直接使用这些框架的网络请求,譬如xutils的,直接就new HttpUtils,然后就做请求处理了,这就是我要讲的问题。activity是用来做界面展示的,它不应该与任何的网络请求框架有耦合,也不应该与任何的DB框架有耦合,万一将来你要换框架(或者框架升级后,参数名发生改变,方法名发生改变,或者回调的参数数量改变),那所有发起调用的地方都要修改,这将是致命的。
所以我要做的就是把耦合框架的地方做到最少,让activity与框架彻底脱离关系。
观察各种网络请求框架,无非就是几个属性,1、Get和Post,2、请求的参数,3、回调。get和post好说,不同的框架有的是区分参数,有的是区分方法名。请求的参数,一般是用不同的类来携带,譬如RequestParams.put(key,value)类似于这样的。回调的话,一般是返回的数据类型不同,方法名不同。
那么把这些耦合和调用者分离开来,就是我们的目的。
我这里采用的方式是把请求做成一个请求码,譬如100,用一个数字来做为一次请求的唯一标识。调用的地方大概是这个样子,
HttpUtil.sendRequest(Constant.GET_GOODS_GATEGOERY, map, new GetDataCallBack() { @Override public void success(String content) { super.success(content); //DO your buisness here } });第一个参数是请求码,可以是你设定规则的数字,第二个是HashMap,用来存储请求的键值对,不与任何框架的携带请求参数的类关联,第三个是自己定义的回调类来代替框架的回调接口。HttpUtil类如下
package com.ab.http.wolf;import java.util.HashMap;import com.ab.application.MyApplication;import com.ab.http.AbHttpUtil;import com.ab.http.AbRequestParams;import com.ab.http.AbStringHttpResponseListener;/** * 网络工具类 * @author wuwf * */public class HttpUtil {/** * 发送网络请求的方法 */public static void sendRequest(int requestCode, HashMap<String, String> map,final GetDataCallBack call) {String url = getUrl(requestCode, map);if(map == null) {send(isGet(requestCode), url, null, call);return;}AbRequestParams params = new AbRequestParams(map);send(isGet(requestCode), url, params, call);}/** * 真正的请求 */private static void send(boolean get, String url, AbRequestParams params,final GetDataCallBack call) {AbHttpUtil abHttpUtil = AbHttpUtil.getInstance(MyApplication.getInstance());ResponseListener listener = new ResponseListener(call);// 如果是get请求if (get) {//如果无参数if(params == null) {abHttpUtil.get(url, listener);return;}abHttpUtil.get(url, params, listener);return;} // post请求if(params == null) {abHttpUtil.post(url, listener);return;}abHttpUtil.post(url, params, listener);}/** * 根据请求码获取url地址 */private static String getUrl(int requestCode, HashMap<String, String> map) {String url = null;switch (requestCode) {case 100:url = "http://XXX.cn/X.action";break;default:break;}return url;}/** * 如果请求码是1XX则是get请求,如果是2XX则是post请求 */private static boolean isGet(int requestCode) {if (requestCode >= 100 && requestCode < 200) {return true;}return false;}private static class ResponseListener extends AbStringHttpResponseListener {private GetDataCallBack call;public ResponseListener(GetDataCallBack call) {this.call = call;}@Overridepublic void onStart() {if(call != null)call.start();}@Overridepublic void onFinish() {if(call != null)call.finish();}@Overridepublic void onFailure(int statusCode, String content,Throwable error) {if(call != null)call.failure();}@Overridepublic void onSuccess(int statusCode, String content) {if(call != null)call.success(content);}}}返回的GetDataCallBack
package com.ab.http.wolf;/** * @author wuwf * @version 创建时间:2014-12-1 下午4:56:45 * 类说明 */public class GetDataCallBack {public void start() {}public void finish() {}/** * 成功返回并且返回字符串 * @param content * 返回的字符串 */public void success(String content) {}/** * 成功返回并且返回对象 * @param content * 返回的对象 */public <T> void successBean(T bean) {}/** * 失败调用 */public void failure() {}}在HttpUtil里面,定义了如果requestCode大于100小于200,认为是get请求,其他为post请求,规则自己定。然后在getUrl获取请求地址的地方,来根据不同requestCode来设置具体的请求url,具体发起网络请求的框架也随意指定,这里选择的是AndBase的AbHttpUtil。将来如果要替换框架,只需要修改这个类的几个地方就可以了。
这样的话,任何发起网络请求的地方,只与requestCode有关联,所有传的参数都放到HashMap里,回调类也是自己定义的。所以无论未来怎么变化网络请求,都不用修改发起的activity,修改只限于HttpUtil。
更多相关文章
- android webview里设置cookie
- Android(安卓)MVVM框架 DataBinding
- Android(安卓)中文 API (100) —— ScrollView
- Android(安卓)Framework系列之IPC(二)
- Android中使用Post请求
- android stagefright 框架
- Android(安卓)核心分析 之六 -----IPC框架分析 Binder,Service,Se.
- 关于Android自定义相机进行拍照(小米手机出现异常的原因)
- Android开发主页框架搭建