关于AsyncHttpClient使用


  在Android开发中,发送、处理http请求简直太常见了,以至于我们的代码里到处充斥着各种HttpClient和与之相关又臭又长的代码,
 
它们存在于你代码的各个角落,每次看见都令人作呕,而你仅仅是为了server能返回一个string或者json给你。每次当我自己写这样
 
的代码时,我都会想能不能简化下这个流程,可能2、3行代码就能搞定。因为针对最简单的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。它的feature包括:
 
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。
接下来,带领大家看看应用android-async-http来写代码是个啥样子。简单来说你只需要3步,
 
1. 创建一个AsyncHttpClient;
 
2. (可选的)通过RequestParams对象设置请求参数;
 
3. 调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类
 
,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。
 
来看看代码如何写:
 
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
 
    @Override
    public void onStart() {
        // called before request is started
    }
 
    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }
 
    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }
 
    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
    }
});
匿名内部类的方式实现AsyncHttpResponseHandler,而且更棒的是你只需要override感兴趣的方法,比如一般都是onSuccess和onFailure。
 
这个版本的get方法没有为请求传递任何参数,当然你也可以通过RequestParams来传递各种参数,如下:
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.get("http://www.google.com", params, new
    AsyncHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] response) {
            System.out.println(response);
        }
 
        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
            Log.d("ERROR", error);
        }    
    }
);
以上的例子是返回的response直接是原生字节流的情况,如果你需要把返回的结果当一个String对待,这时只需要匿名实现一个
 
TextHttpResponseHandler就行,其继承自AsyncHttpResponse,并将原生的字节流根据指定的encoding转化成了string对象,
 
代码如下:
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
client.get("http://www.google.com", params, new
    TextHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, String response) {
            System.out.println(response);
        }
 
        @Override
        public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {
            Log.d("ERROR", error);
        }    
    }
);

同样的方式,你可以发送json请求,代码如下:
String url = "https://ajax.googleapis.com/ajax/services/search/images";
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("q", "android");
params.put("rsz", "8");
client.get(url, params, new JsonHttpResponseHandler() {            
    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
       // Handle resulting parsed JSON response here
    }
    @Override
    public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
      // Handle resulting parsed JSON response here
    }
});

看到了没,返回的response已经自动转化成JSONObject了,当然也支持JSONArray类型,override你需要的那个版本就行。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java AsyncHttpClient 是一个基于非阻塞的、事件驱动的 HTTP 客户端库。它提供了简洁易用的 API,用于发送 HTTP 请求并处理响应。AsyncHttpClient 支持异步执行请求,并且可以处理大量的并发请求。它是基于 Netty 库实现的,具有高性能和可靠性。 使用 AsyncHttpClient,你可以创建一个客户端实例并发送各种类型的 HTTP 请求,例如 GET、POST、PUT、DELETE 等。你可以设置请求的 URL、请求头、请求体等,并指定回调函数来处理响应结果。 下面是一个使用 AsyncHttpClient 发送 GET 请求的示例代码: ```java import org.asynchttpclient.*; public class AsyncHttpClientExample { public static void main(String[] args) throws Exception { try (AsyncHttpClient asyncHttpClient = Dsl.asyncHttpClient()) { asyncHttpClient.prepareGet("http://example.com/") .execute(new AsyncCompletionHandler<Response>() { @Override public Response onCompleted(Response response) throws Exception { System.out.println(response.getResponseBody()); return response; } @Override public void onThrowable(Throwable t) { t.printStackTrace(); } }); } } } ``` 在上面的示例中,我们使用 `prepareGet` 方法创建一个 GET 请求,并指定了请求的 URL。然后,我们通过 `execute` 方法发送请求,并使用匿名内部类实现了 `AsyncCompletionHandler` 接口来处理响应结果。在 `onCompleted` 方法中,我们可以获取响应的内容并进行处理。 除了 GET 请求,AsyncHttpClient 还支持其他类型的请求,如 POST、PUT、DELETE 等。你可以根据实际需求选择合适的方法进行使用。 希望对你有帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值