• Android Asynchronous Http Client 中文教程


    本文为译文,原文链接https://loopj.com/android-async-http/

    安卓异步httpclient

    概述

    这是一个异步的基于回调的Android http客户端,构建于Apache httpclient库上。全部的请求都是独立于UI线程的。与此同一时候回调会由handler在发起请求的线程中执行。你也能够在后台线程和服务中使用它,这个库会自己主动识别它的执行环境。

    特点

    异步请求,回调处理。

    不会堵塞UI线程。

    使用线程池来负担并发请求。

    GET/POST參数构建。

    文件分部上传(不须要其他库的支持)。

    流化上传JSON(不须要其他库的支持)

    处理循环和相关的重定向。

    包大小仅仅有90kb

    自己主动智能请求重试。对不稳定的移动链接而优化。

    自己主动使用gzip响应编码,以支持超快请求。

    二进制的通讯协议,使用BinaryHttpResponseHandler。

    内建对应解析为JSOn的机制。使用JsonHttpResponseHandler。

    直接保存对应。使用FileAsyncHttpResponseHandler。

    持久的cookie存储,保存在SharedPreferences中。

    集成 Jackson JSON,Gson以及其他JSON系列框架。通过使用BaseJsonHttpResponseHandler。

    支持SAX解析。通过使用SaxAsyncHttpResponseHandler。

    支持语言和内容的编码,不不过UTF-8。

     

    使用本库的高端App和开发人员

     

    Instagram

    Pinterest

    FrontlineCommando (Glu Games)

    Heyzap

    Pose

    Thousandsmore apps…

     

    安装和基本使用

    加入maven依赖使用gradle构建。

    dependencies {

      compile 'com.loopj.android:android-async-http:1.4.8'

    }

    导入http包

    import com.loopj.android.http.*;

    创建一个新的AsyncHttpClient 实例,并发送请求:

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("https://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
              }
    });

    推荐使用方法:创建一个静态的httpclient

    在这个样例中,我们将创建一个httpclient,使用静态的訪问器。使我们与Twitter的API的通信更easy。

    import com.loopj.android.http.*;
     
    public class TwitterRestClient {
      private static final String BASE_URL = "https://api.twitter.com/1/";
     
      private static AsyncHttpClient client = new AsyncHttpClient();
     
      public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
          client.get(getAbsoluteUrl(url), params, responseHandler);
      }
     
      public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
          client.post(getAbsoluteUrl(url), params, responseHandler);
      }
     
      private static String getAbsoluteUrl(String relativeUrl) {
          return BASE_URL + relativeUrl;
      }
    }

    这样话,你后面在使用Twitter的api就非常easy了:

    import org.json.*;
    import com.loopj.android.http.*;
     
    class TwitterRestClientUsage {
        public void getPublicTimeline() throws JSONException {
            TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    // If the response is JSONObject instead of expected JSONArray
                }
                
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
                    // Pull out the first event on the public timeline
                    JSONObject firstEvent = timeline.get(0);
                    String tweetText = firstEvent.getString("text");
     
                    // Do something with the response
                    System.out.println(tweetText);
                }
            });
        }
    }

    查看AsyncHttpClientRequestParams 和AsyncHttpResponseHandler的java文档来了解很多其它。

     

    持久的cookie存储,使用PersistentCookieStore

    这个库也包括了一个持久的cookie存储功能,使用了apachehtpclient cookiestore接口。自己主动的存储cookies到sharedpreferences。

    这个特别实用,当你想使用cookies来管理带你的鉴权会话。由于用户在退出或者又一次打开你的app时,都能够保持登录状态。

    第一步,建立一个AsyncHttpClient的实例:

    AsyncHttpClient myClient = new AsyncHttpClient();

    使用activity的context或者application的context来构建这个client的cookies的PersistentCookieStore实例。

    PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
    myClient.setCookieStore(myCookieStore);

    如今,不论什么从服务端获得的cookies将会持久的存储。

    加入你自己的cookies。仅仅要构建一个cookies然后调用addcookie。

    BasicClientCookie newCookie = new BasicClientCookie("cookiesare", "awesome");
    newCookie.setVersion(1);
    newCookie.setDomain("mydomain.com");
    newCookie.setPath("/");
    myCookieStore.addCookie(newCookie);

    PersistentCookieStoreJavadoc 获得很多其它信息。

     

    加入GET/POST參数,使用RequestParams

    你的GET或者POST请求都能够加入參数。

    RequestParams 能够下面几种方式构建:

     

    创建空的參数集并加入參数:

    RequestParams params = new RequestParams();
    params.put("key", "value");
    params.put("more", "data");

     

    创建单參数的RequestParams :

    RequestParams params = new RequestParams("single", "value");

     

    从已有的Map中创建參数集:

    HashMap<String, String> paramMap = new HashMap<String, String>();
    paramMap.put("key", "value");
    RequestParams params = new RequestParams(paramMap);

     

    RequestParamsJavadoc 了解很多其它。

     

    使用參数上传文件

     

    參数集支持分部上传文件,例如以下:

    加入输入流到參数来上传:

    InputStream myInputStream = blah;
    RequestParams params = new RequestParams();
    params.put("secret_passwords", myInputStream, "passwords.txt");

     

    加入一个对象到參数来上传:

    File myFile = new File("/path/to/file.png");
    RequestParams params = new RequestParams();
    try {
        params.put("profile_picture", myFile);
    } catch(FileNotFoundException e) {}

     

    加入一个比特数据到參数来上传:

    byte[] myByteArray = blah;
    RequestParams params = new RequestParams();
    params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");

     

    RequestParamsJavadoc 了解很多其它。

     

    下载二进制数据使用FileAsyncHttpResponseHandler

    FileAsyncHttpResponseHandler 能够用来下载二进制数据比方图片和其他文件。样例:

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("https://example.com/file.png", new FileAsyncHttpResponseHandler(/* Context */ this) {
        @Override
        public void onSuccess(int statusCode, Header[] headers, File response) {
            // Do something with the file `response`
        }
    });

    FileAsyncHttpResponseHandlerJavadoc 了解很多其它。

     

    加入HTTP基本鉴权证书

    一些API服务可能要求HTTP基本訪问认证,因此可能须要给请求提供username/password来认证。使用setBasicAuth()来提供认证。

    对特定请求设置 username/password对不论什么主机和域名。默认的,认证对不论什么主机域名和port都起作用。

    AsyncHttpClient client = new AsyncHttpClient();
    client.setBasicAuth("username","password/token");
    client.get("https://example.com");

    推荐,你也能够提供一个更具体的鉴权范围。

    AsyncHttpClient client = new AsyncHttpClient();
    client.setBasicAuth("username","password", new AuthScope("example.com", 80, AuthScope.ANY_REALM));
    client.get("https://example.com");

    看 RequestParams Javadoc 了解很多其它。

     

    在设备上測试

    你能够在真机或者模拟器上測试这个库。使用提供的样例程序。样例程序实现了全部的重要的库功能。

    你能够把它们当作实际代码的灵感。

    样例程序:https://github.com/loopj/android-async-http/tree/master/sample

    为了执行样例,从android-async-http的github库上克隆项目。而且在root下执行例如以下命令:

    gradle :sample:installDebug

    这个命令会安装样例程序在链接的机器上,全部的样例都能够高速的执行,假设不行,请在https://github.com/loopj/android-async-http/issues提交问题。

     

    从源代码构建

    首先克隆项目,然后安装Android sdk 和 gradle。然后运行:

    gradle :library:jarRelease

    将会产生目标文件: {repository_root}/library/build/libs/library-1.4.8.jar.

     

    报告bug和特性需求

    https://github.com/loopj/android-async-http/issues

     

    工作人员和贡献者

    James Smith (https://github.com/loopj)

    Creator and Maintainer

    Marek Sebera (https://github.com/smarek)

    Maintainer since 1.4.4 release

    Noor Dawod (https://github.com/fineswap)

    Maintainer since 1.4.5 release

    Luciano Vitti (https://github.com/xAnubiSx)

    Collaborated on Sample Application

    Jason Choy (https://github.com/jjwchoy)

    Added support for RequestHandle feature

    Micah Fivecoate (https://github.com/m5)

    Major Contributor,including the original RequestParams

    The Droid FuProject (https://github.com/kaeppler/droid-fu)

    Inspiration and code for better httpretries

    Rafael Sanches (https://blog.rafaelsanches.com)

    Original SimpleMultipartEntity code

    Anthony Persaud (https://github.com/apersaud)

    Added support for HTTP BasicAuthentication requests.

    Linden Darling (https://github.com/coreform)

    Added support for binary/image responses

    许可证

    ApacheLicense, Version 2.0. 

    https://www.apache.org/licenses/LICENSE-2.0

     

    关于作者

    James Smith, Britishentrepreneur and developer based in San Francisco.

    I'm the co-founder of Bugsnag with Simon Maynard, andfrom 2009 to 2012 I led up the product team as CTO of Heyzap.

    Follow @loopj


    本文下载

    http://download.csdn.net/detail/zhounanzhaode/8924505

     

  • 相关阅读:
    js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
    js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内
    tfs 2013 利用 web deploy 完成asp.net站点自动发布
    Web Deploy 服务器安装设置与使用
    MD5加密解密类(asp.net)&使用MD5过时处理
    C# 中Web.config文件的读取与写入
    巧用Ajax的beforeSend 提高用户体验
    一个通用的分页类
    EventSource 对象用于接收服务器发送事件通知,是网页自动获取来自服务器的更新
    Java WebSockets
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6810052.html
Copyright © 2020-2023  润新知