前言
Android业务层就是涉及app业务相关的,网络层为啥要触耦,因为一个好的架构和项目往往要适应不同开发场景和业务需求,如何有一天你的小同事需要替换网络库,用volley怎么办,那么本篇就是讲的如何解耦,其实大多还是用到观察者模式。
先看看老的代码截图如下:
public class HupuHttpHandler extends AsyncHttpResponseHandler { public BaseActivity a; public int messageID1; public int messageID2; public HupuHttpHandler(BaseActivity act) { a = act; } @Override public void onFinish() { super.onFinish(); } @Override public void onSuccess(HttpEntity content, int reqType) { super.onSuccess(content, reqType); if (a != null && !a.isFinishing()) { BaseEntity o = JsonPaserFactory.paserObj(content, reqType); if (o != null && o.err != null) { a.onErrResponse(null, o.err, reqType); return; } if (messageID1 != 0) a.onReqResponse(o, reqType, messageID1, messageID2); else a.onReqResponse(o, reqType); } } @Override public void onFailure(Throwable error, String content, int reqType) { super.onFailure(error, content, reqType); if (a != null && !a.isFinishing()) { a.onErrResponse(error, content, reqType); } } }
以上就是老的框架模型,大家看到a是代表了一个BaseActivity对象。这样就把业务层和网络库死死的绑在一块,如果采用面向接口模式的话,这肯定不符合,也不符合模块独立化的要求如下图:
/** * 请求callback; * @author hushaoping * */ public interface HttpCallback { /** * 请求成功 * @param content 返回值 * @param object 返回的转化对象 * @param reqType 请求的唯一识别 */ public void onSuccess(String content,Object object,int reqType); /** * 请求失败 * @param error 错误 * @param content 返回值 * @param reqType 请求的唯一识别 */ public void onFailure(Throwable error, String content, int reqType); }
public class BaseHttpHandler extends AsyncHttpResponseHandler { private HttpCallback response; public int messageID1; public int messageID2; public BaseHttpHandler(HttpCallback response) { this.response = response; } @Override public void onFinish() { super.onFinish(); } @Override public void onSuccess(HttpEntity content, int reqType) { super.onSuccess(content, reqType); if (response!= null) { try { Log.i("HU","handle==content="+content); BaseEntity entity=JsonPaserFactory.paserObj(content, reqType); response.onSuccess(EntityUtils.toString(content), entity, reqType); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void onFailure(Throwable error, String content, int reqType) { super.onFailure(error, content, reqType); if (response != null) { response.onFailure(error, content, reqType); } } }
图上两张就能看到我们把BaseActivity中的a替换成了接口HttpCallback,这样就把业务层和网络层关系抽离出来 了,不能直接跟activity打交代,那么优化到这个地步就完了吗?肯定不是,如果要能随意切换网络库里,我们就才走出了第一步。如何实现多个网络同用,那就要考虑到做一个共性,设计模式中有装饰器模式,我个人理解就是装饰器模式就是一个商场,可以用来购物、吃饭、游玩等,至于具体解释请参考:
http://blog.csdn.net/hguisu/article/details/7531960。
那么这下应该找到一个共性,就是申请网络,大多用到get、post、参数传递、url、头部信息等。具体改造如下图:
/** * 请求对象模板接口 * @author hushaoping * */ public interface BaseHttpClient { public void post(int reqType,Context context, String url, RequestParams params, HttpCallback callback); public void post(int reqType,Context context, String url, HttpEntity entity, String contentType, HttpCallback callback); public void post(int reqType,Context context, String url, Map<String, String> clientHeaderMap, RequestParams params, String contentType, HttpCallback callback); public void post(int reqType,Context context, String url, Header[] headers, HttpEntity entity, String contentType, HttpCallback callback); public void get(int reqType,String url, RequestParams cacheParams, HttpCallback callback); public void get(int reqType,Context context, String url, RequestParams cacheParams, HttpCallback callback); }
/** * AsyncHttpClient async网络申请实现类 * 如果有新网络tcp请求,就要重新实现一个网络交互类 * * @author 胡少平 * */ public class AsyncHttpClientImpl implements BaseHttpClient { private AsyncHttpClient client=null; //单例模式实现 private static AsyncHttpClientImpl instance; public static AsyncHttpClientImpl getHupuHttpClient() { if (instance == null) instance = new AsyncHttpClientImpl(); return instance; } private AsyncHttpClientImpl() { client = new AsyncHttpClient(); } @Override public void get(int reqType, String url, RequestParams cacheParams, HttpCallback callback) { client.get(url,cacheParams, new BaseHttpHandler(callback), reqType); } @Override public void get(int reqType, Context context, String url, RequestParams cacheParams, HttpCallback callback) { // TODO Auto-generated method stub client.get(url, cacheParams,new BaseHttpHandler(callback), reqType); } @Override public void post(int reqType, Context context, String url, RequestParams params, HttpCallback callback) { // TODO Auto-generated method stub client.post(url,params, new BaseHttpHandler(callback), reqType); } @Override public void post(int reqType, Context context, String url, HttpEntity entity, String contentType, HttpCallback callback) { // TODO Auto-generated method stub client.post(context,url, entity,contentType,new BaseHttpHandler(callback), reqType); } @Override public void post(int reqType, Context context, String url, Map<String, String> clientHeaderMap, RequestParams params, String contentType, HttpCallback callback) { // TODO Auto-generated method stub } @Override public void post(int reqType, Context context, String url, Header[] headers, HttpEntity entity, String contentType, HttpCallback callback) { // TODO Auto-generated method stub client.post(context,url, headers,entity,contentType,new BaseHttpHandler(callback), reqType); } }