android-async-http使用

源码:https://github.com/loopj/android-async-http
简单应用实例:https://github.com/loopj/android-async-http/tree/master/sample
提交bug或建议: https://github.com/loopj/android-async-http/issues
Android Asynchronous Http Client官方介绍:http://loopj.com/android-async-http/

总览
Android Asynchronous Http Client是在Apache HttpClient基础上基于回调的Android http客户端类库。所有的请求都不会在你app的UI主线程上执行,但是任何回调逻辑将会通过Android的Handler消息传送机制使之运行在回调类被创建的线程上。你可以在Service或后台线程上使用它,它将会自动识别运行的上下文环境。
* 回调类是用来传递给Client处理请求返回的结果

功能特性

  • 异步执行HTTP请求,在匿名callbacks中处理响应
  • HTTP请求在UI主线程外执行
  • 请求使用线程池来限制并发资源的使用情况
  • GET/POST参数构建者(RequestParams)
  • 没有额外第三方库的文件分割上传
  • 没有额外第三方库的JSON上传
  • 处理循环和相关重定向
  • 只占用你应用空间很小部分,仅仅90kb就可以做一切事情
  • 为质量不一的android移动设备连接网络所设计的自动的智能的请求重发机制
  • 自动解码响应的gzip,支持极速请求
  • 可以与二进制通信的BinaryHttpResponseHandler
  • 内置的可以将响应结果解析成JSON的JsonHttpResponseHandler
  • 直接将结果保存成文件形式的FileAsyncHttpResponseHandler
  • 持久化Cookie,保存Cookie在你app的SharedPreferences
  • 通过BaseJsonHttpResponseHandler集成了Jackson JSON,Gson或者其他(反)序列化的JSON库
  • SaxAsyncHttpResponseHandler支持SAX解析器
  • 支持语言和内容编码,而不仅仅是UTF-8

安装和基本使用

使用gradle脚本语言添加maven依赖

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
    }
});

推荐用法:使用一个静态的Http Client

在下面的这个例子中,为了使访问Twitter的API变得简单,我们将使用一个静态的http client类:

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协同工作变得更为简单

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);
            }
        });
    }
}

更多详情可以查阅Javadocs里的AsyncHttpClient, RequestParams and AsyncHttpResponseHandler

使用PersistentCookieStore持久化Cookie

这个库也包含了一个继承自Apache HttpClient CookieStore接口的PersistentCookieStore ,其中Apache HttpClient的 CookieStore可以自动保存cookies 到Android设备上的SharedPreferences 。
由于用户在关闭和重新打开app后,仍然登录着,如果你想用cookies来管理会话认证,这将非常好用。
首先创建一个AsyncHttpClient实例:

AsyncHttpClient myClient = new AsyncHttpClient();

现在将此客户端的cookie实例成一个PersistentCookieStore对象:

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

任何接收自服务端的cookies都将被存储于这里。
要添加你自己的cookies到本地存储里,只需要创建一个cookie对象并且调用addCookie即可:

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

使用RequestParams添加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 创建RequestParams :
HashMap<String, String> paramMap = new HashMap<String, String>();
paramMap.put("key", "value");
RequestParams params = new RequestParams(paramMap);

使用RequestParams上传文件

此外,RequestParams支持多附件上传:
上传输入流InputStream:

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");

使用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`
    }
});

添加HTTP 基本的授权证书

当处理HTTP基本访问认证(HTTP Basic Access Authentication)请求的API服务,一些请求也许需要用户名密码认证,你可以使用setBasicAuth()方法去提供你的身份认证。
通过一个特别的请求,为任何主机和领域设置用户名密码。默认的认证范围是所有的主机、端口和领域。

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");
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值