Android开源库--Asynchronous Http Client异步http客户端

如果说我比别人看得更远些,那是因为我站在了巨人的肩上。

github地址:https://github.com/loopj/android-async-http

Api文档地址:http://loopj.com/android-async-http/doc/

http通信作为开发android最基本的模块,相信大家开发网络应用时都会需要用到。

在初学android的时候自己通过Apache的HttpClient类库实现了一个简单的http通信模块,线程安全,每次都要新建一个线程,通过Hander完成异步加载。

后面通过github找到了这个类库,原理也类似,也用的是Apache的HttpClient,而Android官方的类库是HttpUrlConnection。

目前还没有认真研究过源码,设计封装的很好,今天就主要介绍一下这个类库。

介绍

AHC是基于Apache的HttpClient 库,所有的网络请求过程在UI线程之外进行,而回调是在Handler里面处理。也可以再Service或者后台程序里面使用,这个库会自动识别并在相应的Context进行处理。

特性

  1. 异步发送HTTP请求,在回调函数中处理响应
  2. HTTP请求过程不在UI线程进行
  3. 使用线程池来管理并发数
  4. 支持GET/POST请求参数单独设置
  5. 无需其他库上传序列化JSON数据
  6. 处理重定向
  7. 体积小,只有90K
  8. 针对不同的网络连接对重试次数进行智能优化
  9. 支持gzip
  10. 二进制通信协议使用BinaryHttpResponseHandler处理
  11. 内置Json解析,使用JsonHttpResponseHandler对响应进行处理
  12. 使用FileAsyncHttpResponseHandler直接将响应保存到文件中
  13. 动态保存Cookie,将Cookie保存到应用的SharedPreferences中
  14. 使用BaseJsonHttpResponseHandler可以搭配Jackson JSON,Gson或者其他的Json反序列化库
  15. 支持SAX解析,使用SaxAsyncHttpResponseHandler
  16. 支持多语言多种编码方式,不只是UTF-8

主要类介绍

  • AsyncHttpRequest

继承自Runnabler,被submit至线程池执行网络请求并发送start,success等消息

  • AsyncHttpResponseHandler

接收请求结果,一般重写onSuccess及onFailure接收请求成功或失败的消息,还有onStart,onFinish等消息

  • TextHttpResponseHandler

继承自AsyncHttpResponseHandler,只是重写了AsyncHttpResponseHandler的onSuccess和onFailure方法,将请求结果由byte数组转换为String

  • JsonHttpResponseHandler

继承自TextHttpResponseHandler,同样是重写onSuccess和onFailure方法,将请求结果由String转换为JSONObject或JSONArray

  • BaseJsonHttpResponseHandler

继承自TextHttpResponseHandler,是一个泛型类,提供了parseResponse方法,子类需要提供实现,将请求结果解析成需要的类型,子类可以灵活地使用解析方法,可以直接原始解析,使用gson等。

  • RequestParams

请求参数,可以添加普通的字符串参数,并可添加File,InputStream上传文件

  • AsyncHttpClient

核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。

  • SyncHttpClient

继承自AsyncHttpClient,同步执行网络请求,AsyncHttpClient把请求封装成AsyncHttpRequest后提交至线程池,SyncHttpClient把请求封装成AsyncHttpRequest后直接调用它的run方法。

使用方法在官方网站写的比较详细,demo里面也有,大家看看就懂了

以上内容参考:

http://www.cnblogs.com/angeldevil/p/3729808.html

http://blog.csdn.net/qduningning/article/details/34829429

目前主流数据都是用REST模式,json格式通信,因为我还是比较喜欢Gson(因为可以直接泛型转换),JsonHttpResponseHandler用不习惯。在实际项目中我又自己封装了一次,使用TextHttpResponseHandler获取结果后,用Gson解析。

android-async-http的封装

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

public class RestHttpUtils {
    private static AsyncHttpClient client = new AsyncHttpClient();

    static {
        client.addHeader("accept", "application/json");
    }

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

    public static void get(String url, AsyncHttpResponseHandler responseHandler) {
        client.get(url, null, responseHandler);
    }

    public interface RestHttpHandler<T> {
        public  void onSuccess(T result);
    }
}

Gson的封装

public class GsonUtils {
    private static Gson _gson = new Gson();

    public static <T> T parse(String json, Class<T> T) {
        return _gson.fromJson(json, T);
    }

    public static <T> T parseList(String json, Type type) {
        return _gson.fromJson(json, type);
    }
}

业务逻辑Controller

public class Controller {    public static void getDetail(final Context ctx, int id, final RestHttpHandler<Entity> handler) {
        RestHttpUtils.get(ApiUrls.getDetail() + "/id/" + id, new TextHttpResponseHandler() {
            @Override
            public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) {
                Toast.makeText(ctx, "获取详情失败", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onSuccess(int arg0, Header[] arg1, String arg2) {
                Entity result = GsonUtils.parse(arg2, Entity.class);
                handler.onSuccess(result);
            }
        });
    }}

具体使用

Controller.getDetail(DetailActivity.this, getIntent().getIntExtra("Id", 0),
                new RestHttpHandler<Entity>() {

                    @Override
                    public void onSuccess(Entity result) {              //获取结果,进行一系列ui操作
                    }
                });
时间: 2024-10-21 05:27:18

Android开源库--Asynchronous Http Client异步http客户端的相关文章

【Java&amp;Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同时支持同步和异步请求)开篇

在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正式开篇来详细介绍这个库的实现,同时结合源码探讨如何设计一个优雅的Android网络请求框架.做过一段时间Android开发的同学应该对这个库不陌生,因为它对Apache的HttpClient API的封装使得开发者可以简洁优雅的实现网络请求和响应,并且同时支持同步和异步请求. 网络请求框架一般至少需要具备如下几个组件:1

GitHub Top 100的Android开源库

本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best Match」得到的结果,然后过滤了跟Android不相关的项目,所以排名并不具备任何官方效力,仅供参考学习,方便初学者快速了解当前一些流行的Android开源库. 1. React Native 这个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 React Native,

【Java&amp;amp;Android开源库代码分析】のandroid-async-http の开盘

在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正式开篇来具体介绍这个库的实现,同一时候结合源代码探讨怎样设计一个优雅的Android网络请求框架.做过一段时间Android开发的同学应该对这个库不陌生,由于它对Apache的HttpClient API的封装使得开发人员能够简洁优雅的实现网络请求和响应,而且同一时候支持同步和异步请求. 网络请求框架一般至少须要具备例如

Android开源库

http://blog.csdn.net/xiaanming/article/details/9470223 一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才开始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的所有平台,而且他会自动的判断是调用原生Action Bar还是使用扩展ActionBar.在我的小熊词典里有用到这个库,而且很多非常知名的App也在使用这个库.GitHub Official Acti

Android开源库与设计模式开源组SAOS建立

Android开源库与设计模式开源组建立 简介 在2014年年底突然参与了CSDN的博客之星评选,看着自己的博客水平实在太低,于是就想一定得写一些跟别人不太一样的博客出来.经过自己的一番思考,觉得在Android开源库的深入实现上并没有什么太多的资料,或者只是大概讲述了一些基本原理.这样我觉得是不够的,很多事情你没有自己去经历你不会有很深的认识,或者你根本不知道原来它会出现这样的问题.于是我就想我没通过学习轮子制造过程来更加深入的学习,这样不仅能够了解那些知名的开源库,也能够从实战的角度学习开源

(android开源库android-gif-drawable)第二篇 加载网络gif图片

大家好,  今天给大家带来如何使用 android开源库android-gif-drawable来 加载网络gif图片 同样的DEMO下载地址在 最后 请大家去下载 . 如果gif图片地址无效 了.      请大家自行到网上去寻找一个 gif图片地址 复制过去就可以了.谢谢大家 不会在 eclipse下使用  (android开源库android-gif-drawable)     请看我的这篇博客   (android开源库android-gif-drawable)第一篇 eclipse使用

Android 开源库获取途径整理

介绍目前收藏 Android 开源库比较多的 GitHub 项目.网站.Twitter.App 及如何获取最新的 Android 开源库. 1. GitHub Android 开源项目汇总 Android 优秀开源项目实现原理解析 把这两个放在前面,是因为这两个项目我和一群小伙伴在精心维护,同时任何人都可以提交 PR 参与进来.其他网站或 App 都可以以此为数据源 AndroidElementals 西班牙一工程师整理的,目前项目数量和介绍上与 Android 开源项目汇总 还有一定差距 2.

(android开源库android-gif-drawable)第一篇 eclipse使用这个开源库

android开源库android-gif-drawable的使用 android的开源库是用来在android上显示gif图片的.我在网上查了一下,大家说这个框架写的不错,加载大的gif图片   不会内存溢出,于是我就想试试这个开源库,我下了作者的源代码和例子,但是我却跑不起来.不知道为什么,我又到网上去找使用这个开源库的例子发现有一个,我也下载了下来,发现还是跑不起来.我决定自己好好试试这个源代码,终于在我的努力下现在可以用了.废话完了 现在教大家怎么用这个库.大家不想看怎么做的 可以到后面

如何在android上 使用gif图片(android开源库android-gif-drawabl)

android开源库android-gif-drawable的使用 android的开源库是用来在android上显示gif图片的.我在网上查了一下,大家说这个框架写的不错,加载大的gif图片   不会内存溢出,于是我就想试试这个开源库,我下了作者的源代码和例子,但是我却跑不起来.不知道为什么,我又到网上去找使用这个开源库的例子发现有一个,我也下载了下来,发现还是跑不起来.我决定自己好好试试这个源代码,终于在我的努力下现在可以用了.废话完了 现在教大家怎么用这个库.大家不想看怎么做的 可以到后面