Base-Android快速开发框架(五)--网络操作之RequestModel、ResponeModel、CustomAsyncHttpClient

 在正式介绍CustomAsyncHttpClient之前,刚好最近有一个朋友找我帮忙给他们看下一个APP。我先上一段代码截图。一段检测版本更新的接口代码。

大家也看出问题所在了吧。1.网络操作、数据解析操作的业务出现在了activity。2.没有使用线程池 3.josn的解析,没有面向对象。代码高耦合,复用性差、可靠性差。下面开始进入主题,如何在业务层都看不到json的解析代码了,直接通过CustomAsyncHttpClient拿到目标对象进行操作。

/** * RequestModel.java *  * @author: allen * @Function: 网络请求模型 * @createDate: 2014-8-29 * @update: */
public class RequestModel {   private String url;// 请求网络地址   private RequestParams params;// 请求参数   private Class<?> cls;// 请求转换数据模型类   private boolean showDialog = true;// 是否显示网络加载对话框   private boolean showErrorMessage = false;// 是否显示错误的信息

   public String getUrl() {      return url;   }

   public void setUrl(String url) {      this.url = url;   }

   public RequestParams getParams() {      return params;   }

   public void setParams(RequestParams params) {      this.params = params;   }

   public Class<?> getCls() {      return cls;   }

   public void setCls(Class<?> cls) {      this.cls = cls;   }

   public boolean isShowDialog() {      return showDialog;   }

   public void setShowDialog(boolean showDialog) {      this.showDialog = showDialog;   }

   public boolean isShowErrorMessage() {      return showErrorMessage;   }

   public void setShowErrorMessage(boolean showErrorMessage) {      this.showErrorMessage = showErrorMessage;   }

}
/** * @className:ResponeModel.java * @author: allen * @Function: 网络响应模型 * @createDate: 2014-8-29 * @update: */public class ResponeModel {    private Object resultObj;// 转换的Json    private JSONObject dataResult;// 转化为对象的json    private String json;// 服务器返回的整体Json    private Integer code = 0;// 错误码    private boolean status;// 状态    private String msg = "";// 错误信息    private String result = "";// 数据    private int totalCount;// 总条数    private Class<?> cls;// 请求转换数据模型类    private String easyName;// 直接解析的名字    private boolean isList = false;// 是否是数组,默认是对象    private String listCountKey = "totalCount";// 获取总条数的key    private boolean isNew = true;// 是否新的解析    private int buyCount;

    public boolean isNew() {        return isNew;    }

    public void setNew(boolean isNew) {        this.isNew = isNew;    }

    public String getListCountKey() {        return listCountKey;    }

    public void setListCountKey(String listCountKey) {        this.listCountKey = listCountKey;    }

    public boolean isList() {        return isList;    }

    public void setList(boolean isList) {        this.isList = isList;    }

    public String getEasyName() {        return easyName;    }

    public void setEasyName(String easyName) {        this.easyName = easyName;    }

    public Class<?> getCls() {        return cls;    }

    public void setCls(Class<?> cls) {        this.cls = cls;    }

    public Object getResultObj() {        return resultObj;    }

    public void setResultObj(Object resultObj) {        this.resultObj = resultObj;    }

    public String getResult() {        return result;    }

    public void setResult(String result) {        this.result = result;    }

    public JSONObject getDataResult() {        return dataResult;    }

    public void setDataResult(JSONObject dataResult) {        this.dataResult = dataResult;    }

    public String getJson() {        return json;    }

    public void setJson(String json) {        this.json = json;    }

    public Integer getCode() {        return code;    }

    public void setCode(Integer code) {        this.code = code;    }

    public boolean isStatus() {        return status;    }

    public void setStatus(boolean status) {        this.status = status;    }

    public String getMsg() {        return msg;    }

    public void setMsg(String msg) {        if (StringUtils.isEmpty(msg)) {            this.msg = "服务器发生未知错误!";        } else {            this.msg = msg;        }    }

    public int getTotalCount() {        return totalCount;    }

    public void setTotalCount(int totalCount) {        this.totalCount = totalCount;    }

    /**     * 初始化所有数据     */    public void init() {

        initResult();    }

    /**     * 获取某一字段     *     * @return     */    public String parseByName(String name) {        try {            if (!getDataResult().isNull(name)                    && !TextUtils                    .isEmpty((getDataResult().get(name).toString()))) {                return (getDataResult().get(name).toString());            }        } catch (JSONException e) {            // TODO Auto-generated catch block            e.printStackTrace();            return "";        }        return "";    }

    public JSONObject parseJsonToJSONObject(String json) {        try {            return new JSONObject(json);        } catch (JSONException e) {            // TODO Auto-generated catch block            e.printStackTrace();            return new JSONObject();        }    }
 /**     * 获取某一字段     *     * @return     */    public String parseByName(JSONObject object, String name) {        try {            if (!object.isNull(name)                    && !TextUtils.isEmpty((object.get(name).toString()))) {                return (object.get(name).toString());            }        } catch (JSONException e) {            // TODO Auto-generated catch block            e.printStackTrace();            return "";        }        return "";    }

    /**     * 处理返回的结果,做一些简单的处理     */    private void initResult() {        if (isStatus()) {            if (getResult() != null && getResult().length() > 0) {                String Head = getResult().substring(0, 1);                // 注:自动快捷解析的情况                // 1.data直接是对象                // 2.data直接是数组(不含条数)                // 3.data直接是对象,对象里面包含“result”数组(条数可选)                // 其它情况均需返回对象,在你的service中进行处理

                // Data是对象                if ("{".equals(Head)) {                    JSONObject object;                    try {                        object = new JSONObject(getResult());

                        setDataResult(object);                        if (isList) {                            // 带分页                            setResultObj(JsonUtil.convertJsonToList(                                    object.get(getEasyName()).toString(),                                    getCls()));                            if (!object.isNull(getListCountKey())) {// list                                // 带总条数                                try {                                    setTotalCount(Integer.parseInt(object                                            .getString(getListCountKey())));                                } catch (Exception e) {                                    // TODO: handle exception                                    setTotalCount(0);                                }                                // 设置其他分页信息                            }                            return;                        }

                        setResultObj(JsonUtil.convertJsonToObject(                                getResult(), getCls()));

                    } catch (Exception e) {                        e.printStackTrace();                    }

                } else if ("[".equals(Head)) {// data是数组                    setResultObj(JsonUtil.convertJsonToList(getResult(),                            getCls()));                }            }        }    }}

RequestModel、ResponeModel封装了网络操作的输入模型和输出模型。RequestModel根据AsyncHttpClient的输入要求做的封装,同时可以控制是否要显示服务器的错误提示信息,是否弹出对话框。ResponeModel封装了业务层所需要的实体对象。接下来看下关键的CustomAsyncHttpClient处理。

public class CustomAsyncResponehandler extends AsyncHttpResponseHandler {

   private CustomAsyncResponehandler customAsyncResponehandler;

   public CustomAsyncResponehandler() {      customAsyncResponehandler = null;   }

   public CustomAsyncResponehandler(         CustomAsyncResponehandler customAsyncResponehandler) {      if (customAsyncResponehandler != null)         this.customAsyncResponehandler = customAsyncResponehandler;   }

   public void onSuccess(ResponeModel baseModel) {      if (customAsyncResponehandler != null)         customAsyncResponehandler.onSuccess(baseModel);   }

   @Override   public void onStart() {      super.onStart();      if (customAsyncResponehandler != null)         customAsyncResponehandler.onStart();   }

   @Override   public void onFinish() {      super.onFinish();      if (customAsyncResponehandler != null)         customAsyncResponehandler.onFinish();   }

   @Override   public void onFailure(Throwable error, String content) {      super.onFailure(error, content);      if (customAsyncResponehandler != null)         customAsyncResponehandler.onFailure(error, content);   }}
public class CustomAsyncHttpClient {    private String TAG = "CustomAsyncHttpClient";    private boolean isTag = true;

    private AsyncHttpClient asyncHttpClient;    private MyProgressDialog dialog;    private Context mContext;    private ResponeModel baseModel;

    public CustomAsyncHttpClient(Context context) {        asyncHttpClient = new AsyncHttpClient();        mContext = context;        if (mContext != null) {            dialog = new MyProgressDialog(mContext, "", true);            dialog.tv_value.setVisibility(View.GONE);        }        baseModel = new ResponeModel();    }

    public void post(final RequestModel requestModel,                     final CustomAsyncResponehandler responseHandler) {

        RequestParams newParams = new RequestParams();        com.alibaba.fastjson.JSONObject jsonObject = new                com.alibaba.fastjson.JSONObject();        for (BasicNameValuePair param :                requestModel.getParams().getParamsList()) {            jsonObject.put(param.getName(), param.getValue());        }        newParams.fileParams=requestModel.getParams().fileParams;

        newParams.put("p", jsonObject.toString());

        LogUtil.d(TAG, requestModel.getUrl() + "?"                + newParams.toString(), isTag);        asyncHttpClient.post(requestModel.getUrl(), newParams,                new AsyncHttpResponseHandler() {                    @Override                    public void onStart() {                        super.onStart();                        LogUtil.d(TAG, "onStart___", isTag);                        if (requestModel.isShowDialog()) {// 显示网络对话框                            if (mContext != null) {                                dialog.show();                            }                        }                        responseHandler.onStart();                    }

                    @Override                    public void onFinish() {                        super.onFinish();                        LogUtil.d(TAG, "onFinish___", isTag);                        if (requestModel.isShowDialog()) {// 隐藏网络对话框                            if (mContext != null) {                                dialog.dismiss();                            }                        }                        responseHandler.onFinish();                    }

                    @Override                    public void onSuccess(String content) {                        super.onSuccess(content);                        LogUtil.d(TAG, "onSuccess___" + content, isTag);

                        // TODO:解密返回的参数                        baseModel = JsonUtil.convertJsonToObject(content,                                ResponeModel.class);

                        if (baseModel != null) {                            baseModel.setCls(requestModel.getCls());                            baseModel.setJson(content);                            baseModel.init();                            if(baseModel.isStatus()){                                baseModel.setMsg("操作成功");                            }                        }

                        if (requestModel.isShowErrorMessage()&&!baseModel.isStatus()) {                            if (mContext != null) {                                UIHelper.ShowMessage(mContext,                                        baseModel.getMsg());                            }                        }

                        responseHandler.onSuccess(baseModel);                    }

                    @Override                    public void onFailure(Throwable error, String content) {                        super.onFailure(error, content);                        LogUtil.d(TAG, "onFailure___" + content, isTag);                        if (mContext != null) {                            UIHelper.ShowMessage(mContext,                                   "网络异常");                        }                        responseHandler.onFailure(error, content);                    }                });    }}

以后无须再为网络操作而操碎心,下一步希望在Base里面加入支持xml的自动对象转换以及webservice服务器调用的封装支持,希望有兴趣的、或者有更好方案的大神联系我。下面再上一下上一节的使用案例,网络操作的登陆方法:

public void login(final String userName, final String password, final CustomAsyncResponehandler handler) {    RequestModel requestModel = new RequestModel();    RequestParams params = new RequestParams();    params.put("userName", userName);    params.put("password", password);    requestModel.setParams(params);    requestModel.setCls(User.class);    requestModel.setShowErrorMessage(true);    requestModel.setUrl(Urls.userLogin);    httpClient.post(requestModel, new CustomAsyncResponehandler() {        @Override        public void onSuccess(ResponeModel baseModel) {            super.onSuccess(baseModel);

            if (baseModel != null && baseModel.isStatus()) {                AppContext.currentUser = (User) baseModel.getResultObj();                AppContext.currentUser.setUserName(userName);                if (userDao != null) {                    userDao.insert(AppContext.currentUser);                }            }            handler.onSuccess(baseModel);        }    });}
时间: 2024-08-26 21:47:49

Base-Android快速开发框架(五)--网络操作之RequestModel、ResponeModel、CustomAsyncHttpClient的相关文章

看大师讲解Android快速开发框架EasyAndroid

前几天做了小应用,感觉小有成就,名字叫"长见识了",是一款趣味答题类的游戏,题目各种火爆各种经典,下载地址,看似一个简单的答题小游戏却是五脏俱全,从开发流程上都进行了严格的规范,大家有空可以下载玩玩~ 在这个应用中,用到了我以前集成的一个快速开发框架-EasyAndroid,这个框架我以前在做项目的时候总结,整理出来的,对于快速开发Android应用非常实用. 其实,Android应用的开发并不难,我们拿到一款Android应用后,百分之九十以上无外乎有这么几个功能: 1,IOC Mo

android快速开发框架

一.依赖注入DI通过依赖注入减少View.服务.资源简化初始化,事件绑定等重复繁琐工作1. AndroidAnnotations(Code Diet) android快速开发框架项目地址:https://github.com/excilys/androidannotations文档介绍:https://github.com/excilys/androidannotations/wiki官方网站:http://androidannotations.org/特点:(1)依赖注入:包括view,ext

Android 快速开发框架CommonLibsForAndroid(有Demo)

这个项目所包含的功能,全部是从实际项目中提取,开发这个类库的初衷也只是为了方便自己开发Android项目.由于时间所限,目前大量的内容还没整理到这个开源项目中,doc和demo也有所欠缺,我将尽快完善.而其中大量不合理的内容,也将逐步改进. 欢迎大家提各种意见,当然更欢迎fork和pull request. https://github.com/cymcsg/CommonLibsForAndroid CommonLibsForAndroid Using CommonLibs is a fast

Android快速开发框架ZBLibrary源码分享

坐标标准库ZBLibrary,是一个MVP架构的Android快速开发框架,提供一套开发标准(UI,Data,Listener)以及模板和工具类并规范代码. 封装层级少,简单高效兼容性好.Android Studio.Eclipse多平台支持. OKHttp.图片加载.自动缓存以及各种Base.Demo.UI.Util直接用.一句话就能实现全局滑动返回. BaseHttpListActivity,几行代码搞定http请求列表 加载和缓存: BaseView,自定义View竟然如此简单: 万能的E

【源码分享下载】每日更新之Android快速开发框架LoonAndroid

Android快速开发框架LoonAndroid 服务分类: 其他 使用服务: 其他 功能分类: 其他 支持平台: Android 运行环境: Android 开发语言: Java 开发工具: Eclipse 源码大小: 14.65MB 源码下载地址:http://www.devstore.cn/code/info/74.html 源码简介 主要有以下模块: (1) 自动注入框架(只需要继承框架内的application既可) (2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)

Android快速开发框架-ZBLibrary 源码分享

坐标标准库ZBLibrary,是一个MVP架构的Android快速开发框架,提供一套开发标准(UI,Data,Listener)以及模板和工具类并规范代码.封装层级少,简单高效兼容性好.一句代码就可实现全局滑动返回(可重写):集成方便快捷的照片选择器.日期选择器.地址选择器.时间刷新器等. 丰富的功能 简单的实现 详细的注释 规范的风格 下载地址 ?https://github.com/TommyLemon/Android-ZBLibrary 下载试用 ZBLibraryDemoApp.apk

使用android快速开发框架afinal的FinalDb操作android数据库

原文地址:http://my.oschina.net/yangfuhai/blog/87459 今天给大家介绍下#afinal#来操作android的数据库sqlite. #afinal#是一个android的orm.ioc快速开发框架,里面包含了四大功能:空间的id绑定和事件绑定功能:网络图片的显示功能(里面包含了强大的缓存框架):数据库sqlite的操作功能:http数据的读取功能(支持ajax方式读取): #afinal#开源网址:https://github.com/yangfuhai/

Android 快速开发框架Afinal

本文转载自:http://www.oschina.net/p/afinal/ Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题. Afinal的宗旨是简洁,快速.约定大于配置的方式.尽量一行代码完成所有事情. 目前Afinal主要有四大模块: FinalDB模块:a

android快速开发框架xUtils

xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 目前xUtils主要有四大模块: DbUtils模块: android中的orm框架,一行代码就可以进行增删改查: 支持事务,默认关闭: 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束