zoukankan      html  css  js  c++  java
  • 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操作 }
    });

     PS:如果需要上传文件什么的,直接RequestParams.put(key,value),支持多种数据格式,然后post即可。

  • 相关阅读:
    网络文件传输方式
    ETL利器Kettle
    oracle 字符处理
    ORACLE临时表空间
    Count(*)或者Count(1)或者Count([列]) 区别
    Oracle trunc()函数的用法
    DATE 日期格式
    oracle 异常
    物化视图
    域名和端口
  • 原文地址:https://www.cnblogs.com/leestar54/p/4207317.html
Copyright © 2011-2022 走看看