android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次都要又一次编写网络请求,于是基于我比較熟悉的asynchttpclient又一次二次封装了一个网络请求框架。

思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,cookie处理这几个功能,二次助封装后这些功能能够直接调用封装好的方法就可以。

二次助封装代码例如以下:

1.功能接口:

/**********************************************************
 * @文件名:DisposeDataListener.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午11:01:13
 * @文件描写叙述:
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public interface DisposeDataListener
{
    /**
     * 请求開始回调事件处理
     */
    public void onStart();

    /**
     * 请求成功回调事件处理
     */
    public void onSuccess(Object responseObj);

    /**
     * 请求失败回调事件处理
     */
    public void onFailure(Object reasonObj);

    /**
     * 请求重连回调事件处理
     */
    public void onRetry(int retryNo);

    /**
     * 请求进度回调事件处理
     */
    public void onProgress(long bytesWritten, long totalSize);

    /**
     * 请求结束回调事件处理
     */
    public void onFinish();

    /**
     * 请求取消回调事件处理
     */
    public void onCancel();
}

2.请求功能接口适配器模式

public class DisposeDataHandle implements DisposeDataListener
{
    @Override
    public void onStart()
    {
    }

    @Override
    public void onSuccess(Object responseObj)
    {
    }

    @Override
    public void onFailure(Object reasonObj)
    {
    }

    @Override
    public void onRetry(int retryNo)
    {
    }

    @Override
    public void onProgress(long bytesWritten, long totalSize)
    {
    }

    @Override
    public void onFinish()
    {
    }

    @Override
    public void onCancel()
    {
    }
}

3.请求回调事件处理:

/**********************************************************
 * @文件名:BaseJsonResponseHandler.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午10:41:46
 * @文件描写叙述:服务器Response基础类,包含了java层异常和业务逻辑层异常码定义
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class BaseJsonResponseHandler extends JsonHttpResponseHandler
{
    /**
     * the logic layer exception, may alter in different app
     */
    protected final String RESULT_CODE = "ecode";
    protected final int RESULT_CODE_VALUE = 0;
    protected final String ERROR_MSG = "emsg";
    protected final String EMPTY_MSG = "";

    /**
     * the java layer exception
     */
    protected final int NETWORK_ERROR = -1; // the network relative error
    protected final int JSON_ERROR = -2; // the JSON relative error
    protected final int OTHER_ERROR = -3; // the unknow error

    /**
     * interface and the handle class
     */
    protected Class<?> mClass;
    protected DisposeDataHandle mDataHandle;

    public BaseJsonResponseHandler(DisposeDataHandle dataHandle, Class<?> clazz)
    {
        this.mDataHandle = dataHandle;
        this.mClass = clazz;
    }

    public BaseJsonResponseHandler(DisposeDataHandle dataHandle)
    {
        this.mDataHandle = dataHandle;
    }

    /**
     * only handle the success branch(ecode == 0)
     */
    public void onSuccess(JSONObject response)
    {
    }

    /**
     * handle the java exception and logic exception branch(ecode != 0)
     */
    public void onFailure(Throwable throwObj)
    {
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONObject response)
    {
        onSuccess(response);
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse)
    {
        onFailure(throwable);
    }
}

/**********************************************************
 * @文件名:CommonJsonResponseHandler.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午11:01:13
 * @文件描写叙述:业务逻辑层真正处理的地方,包含java层异常和业务层异常
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class CommonJsonResponseHandler extends BaseJsonResponseHandler
{
    public CommonJsonResponseHandler(DisposeDataHandle dataHandle)
    {
        super(dataHandle);
    }

    public CommonJsonResponseHandler(DisposeDataHandle dataHandle, Class<?

> clazz)
    {
        super(dataHandle, clazz);
    }

    @Override
    public void onStart()
    {
        mDataHandle.onStart();
    }

    @Override
    public void onProgress(long bytesWritten, long totalSize)
    {
        mDataHandle.onProgress(bytesWritten, totalSize);
    }

    @Override
    public void onSuccess(JSONObject response)
    {
        handleResponse(response);
    }

    @Override
    public void onFailure(Throwable throwObj)
    {
        mDataHandle.onFailure(new LogicException(NETWORK_ERROR, throwObj.getMessage()));
    }

    @Override
    public void onCancel()
    {
        mDataHandle.onCancel();
    }

    @Override
    public void onRetry(int retryNo)
    {
        mDataHandle.onRetry(retryNo);
    }

    @Override
    public void onFinish()
    {
        mDataHandle.onFinish();
    }

    /**
     * handle the server response
     */
    private void handleResponse(JSONObject response)
    {
        if (response == null)
        {
            mDataHandle.onFailure(new LogicException(NETWORK_ERROR, EMPTY_MSG));
            return;
        }

        try
        {
            if (response.has(RESULT_CODE))
            {
                if (response.optInt(RESULT_CODE) == RESULT_CODE_VALUE)
                {
                    if (mClass == null)
                    {
                        mDataHandle.onSuccess(response);
                    }
                    else
                    {
                        Object obj = ResponseEntityToModule.parseJsonObjectToModule(response, mClass);
                        if (obj != null)
                        {
                            mDataHandle.onSuccess(obj);
                        }
                        else
                        {
                            mDataHandle.onFailure(new LogicException(JSON_ERROR, EMPTY_MSG));
                        }
                    }
                }
                else
                {
                    if (response.has(ERROR_MSG))
                    {
                        mDataHandle.onFailure(new LogicException(response.optInt(RESULT_CODE), response
                                .optString(ERROR_MSG)));
                    }
                    else
                    {
                        mDataHandle.onFailure(new LogicException(response.optInt(RESULT_CODE), EMPTY_MSG));
                    }
                }
            }
            else
            {
                if (response.has(ERROR_MSG))
                {
                    mDataHandle.onFailure(new LogicException(OTHER_ERROR, response.optString(ERROR_MSG)));
                }
            }
        }
        catch (Exception e)
        {
            mDataHandle.onFailure(new LogicException(OTHER_ERROR, e.getMessage()));
            e.printStackTrace();
        }
    }
}

4.自己定义异常类,对java异常和业务逻辑异常封装统一处理

/**********************************************************
 * @文件名:LogicException.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午10:05:08
 * @文件描写叙述:自己定义异常类,返回ecode,emsg到业务层
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class LogicException extends Exception
{
	private static final long serialVersionUID = 1L;

	/**
	 * the server return code
	 */
	private int ecode;

	/**
	 * the server return error message
	 */
	private String emsg;

	public LogicException(int ecode, String emsg)
	{
		this.ecode = ecode;
		this.emsg = emsg;
	}

	public int getEcode()
	{
		return ecode;
	}

	public String getEmsg()
	{
		return emsg;
	}
}

5.请求发送入口类CommonClient:

/**********************************************************
 * @文件名:CommonClient.java
 * @文件作者:rzq
 * @创建时间:2015年8月19日 上午11:38:57
 * @文件描写叙述:通用httpclient,支持重连,取消请求,Cookie存储
 * @改动历史:2015年8月19日创建初始版本号
 **********************************************************/
public class CommonClient
{
	private static AsyncHttpClient client;
	static
	{
		/**
		 * init the retry exception
		 */
		AsyncHttpClient.allowRetryExceptionClass(IOException.class);
		AsyncHttpClient.allowRetryExceptionClass(SocketTimeoutException.class);
		AsyncHttpClient.allowRetryExceptionClass(ConnectTimeoutException.class);
		/**
		 * init the block retry exception
		 */
		AsyncHttpClient.blockRetryExceptionClass(UnknownHostException.class);
		AsyncHttpClient.blockRetryExceptionClass(ConnectionPoolTimeoutException.class);

		client = new AsyncHttpClient();
	}

	public static RequestHandle get(String url, AsyncHttpResponseHandler responseHandler)
	{
		return client.get(url, responseHandler);
	}

	public static RequestHandle get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler)
	{
		return client.get(url, params, responseHandler);
	}

	public static RequestHandle get(Context context, String url, AsyncHttpResponseHandler responseHandler)
	{
		return client.get(context, url, responseHandler);
	}

	public static RequestHandle get(Context context, String url, RequestParams params,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.get(context, url, params, responseHandler);
	}

	public static RequestHandle get(Context context, String url, Header[] headers, RequestParams params,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.get(context, url, headers, params, responseHandler);
	}

	public static RequestHandle post(String url, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(url, responseHandler);
	}

	public static RequestHandle post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(url, params, responseHandler);
	}

	public static RequestHandle post(Context context, String url, RequestParams params,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, params, responseHandler);
	}

	public static RequestHandle post(Context context, String url, HttpEntity entity, String contentType,
			AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, entity, contentType, responseHandler);
	}

	public static RequestHandle post(Context context, String url, Header[] headers, RequestParams params,
			String contentType, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, headers, params, contentType, responseHandler);
	}

	public static RequestHandle post(Context context, String url, Header[] headers, HttpEntity entity,
			String contentType, AsyncHttpResponseHandler responseHandler)
	{
		return client.post(context, url, headers, entity, contentType, responseHandler);
	}

	/**
	 * calcel the context relative request
	 * @param context
	 * @param mayInterruptIfRunning
	 */
	public void calcelRequests(Context context, boolean mayInterruptIfRunning)
	{
		client.cancelRequests(context, mayInterruptIfRunning);
	}

	/**
	 * cancel current all request in app
	 * @param mayInterruptIfRunning
	 */
	public void cacelAllrequests(boolean mayInterruptIfRunning)
	{
		client.cancelAllRequests(mayInterruptIfRunning);
	}

	public static void setHttpContextAttribute(String id, Object obj)
	{
		client.getHttpContext().setAttribute(id, obj);
	}

	public static Object getHttpContextAttribute(String id)
	{
		return client.getHttpContext().getAttribute(id);
	}

	public static void removeHttpContextAttribute(String id)
	{
		client.getHttpContext().removeAttribute(id);
	}

	/**
	 * set the cookie store
	 * @param cookieStore
	 */
	public static void setCookieStore(CookieStore cookieStore)
	{
		client.setCookieStore(cookieStore);
	}

	/**
	 * remove the cookie store
	 */
	public static void removeCookieStore()
	{
		removeHttpContextAttribute(ClientContext.COOKIE_STORE);
	}
}

6.登陆DEMO使用

Cookie的保存,

public class MyApplicaton extends Application {
	private static MyApplicaton app;

	@Override
	public void onCreate() {
		super.onCreate();
		app = this;
		/**
		 * 为全局 CommonClient加入CookieStore,从PersistentCookieStore中能够拿出全部Cookie
		 */
		CommonClient.setCookieStore(new PersistentCookieStore(this));
	}

	public static MyApplicaton getInstance() {
		return app;
	}
}

响应体的处理:

   private void requestLogin()
	{
		RequestParams params = new RequestParams();
		params.put("mb", "");
		params.put("pwd", "");
		CommonClient.post(this, URL, params, new CommonJsonResponseHandler(
				new DisposeDataHandle()
				{
					@Override
					public void onSuccess(Object responseObj)
					{
						Log.e("------------->", responseObj.toString());

					}

					@Override
					public void onFailure(Object reasonObj)
					{
						Log.e("----->", ((LogicException)reasonObj).getEmsg());
					}

					@Override
					public void onProgress(long bytesWritten, long totalSize)
					{
						Log.e("------------->", bytesWritten + "/" + totalSize);
					}
				}));
	}

经过以上封装后。基于的http功能都具备了,假设开发中遇到一些特殊的功能,可能再依据详细的需求扩展。

源代码下载

时间: 2024-10-06 04:22:10

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件的相关文章

Android Bitmap 开源图片框架分析(精华三)

主要介绍这三个框架,都挺有名的,其他的框架估计也差不多了 Android-Universal-Image-Loaderhttps://github.com/nostra13/Android-Universal-Image-Loader ImageLoaderhttps://github.com/novoda/ImageLoader Volley(综合框架,包含图片部分)https://github.com/mcxiaoke/android-volley 扯淡时间,可以跳过这段这些开源框架的源码还

Android Bitmap 开源图片框架分析(精华四)

disk缓存主要难点在于内存缓存,disk缓存其实比较简单,就是图片加载完成后把图片文件存到本地方便下次使用 同样,先贴一下官方主页的介绍(主页地址见文章最开始处)和内存缓存差不多,根据算法不同提供了几种类别,可以自行通过ImageLoaderConfiguration.discCache(..)设置<ignore_js_op> 硬盘缓存,保存是以文件的形式框架提供了4种类型,具体算法规则不同,看名字我们大概也能知道对应意思 UnlimitedDiscCache                

Android Bitmap 开源图片框架分析(精华五)

本帖最后由 boredream 于 2014-5-27 09:07 编辑 ImageLoader和Volley图片部分还包括其他大部分图片框架,基本上图片处理都差不多,区别仅在于部分优化了,而优化方面UIL即Universal-Image-Loader框架做的最好,所以这部分章节算是温习一下图片处理以及寻找下其他框架里面一些不一样的图片处理方式(只关注图片方面) 首先是ImageLoaderhttps://github.com/novoda/ImageLoader主要还是分析图片加载的核心代码部

Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))

1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片请求,图片缓存) (2)封装 Response.Listener 和 Response.ErrorListener 回调函数 (3)用法 3.文件夹介绍 3.1 GsonRequset.java 自己定义Gson请求,直接将 Json字符串  实例化为 对象 3.2 VolleyApplicatio

ASimpleCache(ACache)源码分析(android轻量级开源缓存框架)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46379055 ASimpleCache框架源码链接 https://github.com/yangfuhai/ASimpleCache 杨神作品,大家最熟悉他的应该是afinal框架吧 官方介绍 ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简而来). 1.它可以缓存什么东西? 普通的字符串.JsonObj

axios基于常见业务场景的二次封装

axios axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中.在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络请求库.我在最近的几个项目中都有使用axios,并基于axios根据常见的业务场景封装了一个通用的request服务. 业务场景: 全局请求配置. get,post,put,delete等请求的promise封装. 全局请求状态管理. 取消重复请求. 路由跳转取消当前页面请求. 请求携带token,

Vue.js 自定义组件封装实录——基于现有控件的二次封装(以计时器为例)

在本人着手开发一个考试系统的过程中,出现了如下一个需求:制作一个倒计时的控件显示在试卷页面上.本文所记录的就是这样的一个过程. 前期工作 对于这个需求,自然我想到的是有没有现成的组件可以直接使用(本着不重复发明轮子的原则).于是我就在 GitHub 上找寻.确实找到了不少,但是与需求之间的差距还比较大.从零开始写又不太现实(时间摆在那里,加之自己的前端也是刚学,还没有从零开始手撸一个控件的能力),所以在已有组件的基础上进行二次封装便成了一个比较可行的方法(几乎也是唯一解).遂在 npm 上以 c

《Nodejs开发加密货币》之二十七:开发通用的HTML组件

人的懒惰常常是麻烦的开始.多数程序员都希望自己的工作一劳永逸,一次开发,到处使用,成了人人追逐的目标,我也不例外.最初写<Nodejs开发加密货币>系列文章,因为不喜欢设定好了去写,所以目录反复修改,索性弄了小工具gitbook-summary:在写入门文章的时候,反复搜索github,索性把检索与制图集成到一起,弄了个开发语言检索统计工具(见<Node.js让您的前端开发像子弹飞一样>文章实例):阅读源码的时候,手动整理Uml图很辛苦,干脆写成了js2uml工具(见<轻松从

对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache

虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或其它参数.同时在工作中,我们还会发现,有一些ajax请求的数据,对实时性要求不高,即使我们把第一次请求到的这些数据缓存起来,然后当相同请求再次发起时直接拿之前缓存的数据返回也不会对相关功能有影响,通过这种手工的缓存控制,减少了ajax请求,多多少少也能帮助我们提高网页的性能.本文介绍我自己关于这两方