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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值