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。


更多相关文章

  1. android webview里设置cookie
  2. Android(安卓)MVVM框架 DataBinding
  3. Android(安卓)中文 API (100) —— ScrollView
  4. Android(安卓)Framework系列之IPC(二)
  5. Android中使用Post请求
  6. android stagefright 框架
  7. Android(安卓)核心分析 之六 -----IPC框架分析 Binder,Service,Se.
  8. 关于Android自定义相机进行拍照(小米手机出现异常的原因)
  9. Android开发主页框架搭建

随机推荐

  1. android在service中使用AsyncHttpClient
  2. Android 之事件的分发和消费机制
  3. android:configChanges名词解析(文档翻译)
  4. Android ndk 入门5 - opencv实现
  5. Layout inflation is the term used with
  6. Android关于获取用户是否允许某项权限
  7. Android compress Image
  8. android aosp 源码版本
  9. android 代码片段整理
  10. Android FAILURE: Build failed with an