Android针对http请求的第三方开源框架AsynHttpClient

来源:互联网 发布:青岛seo排名工具 编辑:程序博客网 时间:2024/05/18 00:00

android-async-http AsyncHttpClient是一个非常好的Android针对http请求的开源框架。
AsyncHttpClient 是一个框架提供的库 可以异步传输,使用时需下载android-async-http-1.4.4.jar包导入到项目中
下载地址:http://loopj.com/android-async-http
在Android的开发中,发送和处理http请求是非常常见的事,但是对于http请求处理到处是充斥着又长又臭的代码。通常为了一个小小的数据,就要写大量代码。
因为针对最简单的case,我只需要提供request url,成功时的callback和(或)失败时的callback,仅此而已。针对这一类问题(需求),可以说android-async-http提供了几乎完美的解决方案。
特别是async关键字,看到这个字都知道,这是异步执行,也就是说它的网络请求自动在非UI线程里执行,你不需要任何额外的操作(比如手动new一个Thread之类)。
项目的官方网站:http://loopj.com/android-async-http/,对应的github地址:https://github.com/loopj/android-async-http

  我这里简要介绍下:它是专门针对Android在Apache的HttpClient基础上构建的异步的callback-based http client。所有的请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。你也可以把AsyncHttpClient应用在Service中或者后台线程中,库代码会自动识别出它所运行的context。
  它有哪些特点:
1. 发送异步http请求,在匿名callback对象中处理response;
2. http请求发生在UI线程之外;
3. 内部采用线程池来处理并发请求;
4. GET/POST 参数构造,通过RequestParams类。
5. 内置多部分文件上传,不需要第三方库支持;
6. 流式Json上传,不需要额外的库;
7. 能处理环行和相对重定向;
8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
9. 自动智能的请求重试机制在各种各样的移动连接环境中;
10. 自动的gzip响应解码;
11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
13. 通过BaseJsonHttpResponseHandler和各种json库集成;
14. 支持SAX解析器;
15. 支持各种语言和content编码,不仅仅是UTF-8

使用AsynHttpClient发送http异步请求只需要实现以下步骤:
1. 创建一个AsyncHttpClient;
2. (可选的)通过RequestParams对象设置请求参数;
3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。

如下是我在项目运用中的代码块:

/***构建httpClient实例对象 * 应用级别的HttpClient单例模式 * @since 2014-4-14 10:46:26 */public class AsyncHttpClient extends com.loopj.android.http.AsyncHttpClient {    public final static int TIME_OUT = 15000;    private AsyncHttpClient() {//私有化构造器    }    private static AsyncHttpClient mClient;    public static AsyncHttpClient getInstance() {//供外界获取实例,保证唯一性        if (mClient == null) {            mClient = new AsyncHttpClient();            mClient.setTimeout(TIME_OUT);//设置请求超时时间        }        return mClient;    }}
/** * 处理服务器响应的handler,供其他的handler继承并重写onSuccess和onFailure方法 * 根据本应用改良的ResponseHandler * @since 2014-4-14 13:24:42 * @param <T> */public abstract class SimpleResponseHandler<T> extends AsyncHttpResponseHandler {    protected final Context mContext;    private final Type mType;    /**     * @param context     * @param type     * 请到{@link TypeReferenceFactory}中取对应的{@link Type}     */    public SimpleResponseHandler(Context context, Type type) {        mContext = context;        mType = type;    }    @Override    public void onSuccess(int statusCode, String result) {        BasicResponse<T> response = null;        try {            response = JSON.parseObject(result, mType);//使用fastjson解析返回数据            if (response == null)                throw new Exception();        } catch (Exception e) {            e.printStackTrace();            onFailure(statusCode, R.string.net_get_data_failed, result);            return;        }         if (!response.getSuccess()) {         String msg = response.getMsg();         onFailure(         msg == null ? mContext.getResources().getString(         R.string.net_action_failed) : msg, response);         return;         }        onSuccess(response);    }    @Override    public void onFailure(int statusCode, int msgResource, String result) {        onFailure(mContext.getResources().getString(msgResource), null);    }//响应成功的回调函数    public abstract void onSuccess(BasicResponse<T> result);//响应失败的回调函数    public abstract void onFailure(String msg, BasicResponse<T> result);}

这里是请求的传参方法。将参数put进去,这样就能将参数发送给服务器.

public static RequestParams getNewsParams(Context context, String id,   int page) {        RequestParams params = new RequestParams();        params.put("id", id);        params.put("page", String.valueOf(page));        Log.i("request-params", params.toString());        return params;    }

这里是请求的响应返回数据并处理数据的模块

private class GetNewsResponseHandler extends            SimpleResponseHandler<NewsList> {        public GetNewsResponseHandler(Context context) {            super(context, TypeReferenceFactory.NEWS_LIST);        }        @Override        public void onSuccess(BasicResponse<NewsList> result) {            if (result.getResult() != null)                mNewsListList.addAll(result.getResult());            mNewsListListAdapter.notifyDataSetChanged();        }        @Override        public void onFailure(String    msg,BasicResponse<NewsList> result) {                Toast.makeText(getActivity(), msg,Toast.LENGTH_SHORT).show();        };    }

这样我们就可以请求服务器了。超级简单又方便,还能传送file文件作为参数。

AsyncHttpClient.getInstance().get(HttpPathConfig.GET_NEWS,RequestParamsFactory.getNewsParams(this, id,    Page), new GetNewsResponseHandler(this));

参考http://www.2cto.com/kf/201408/326552.html

1 0
原创粉丝点击