Android Asynchronous Http Client--Android 开源的网络异步加载类

整理Android Asynchronous Http Client的使用

Android Asynchronous Http Client(AHC)

一个回调式的Android网络请求库

概括:

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

谁在用

Instagram,Pinterest,Pose。。。。

怎么用

MVN:

<dependency>
    <groupId>com.loopj.android</groupId>
    <artifactId>android-async-http</artifactId>
    <version>1.4.5</version>
</dependency>

导包:

import com.loopj.android.http.*;

创建一个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
	}
});

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

新建一个网络工具类,定义一个全局静态的Http Client。

import com.loopj.android.http.*;

public class TwitterRestClient {
  private static final String BASE_URL = "http://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;
  }
}

就很容易的在需要请求网路的地方发送 网络请求:

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

API文档http://loopj.com/android-async-http/doc/com/loopj/android/http/AsyncHttpClient.html

使用PersistentCookieStore保存Cookie

这个库包含一个PersistentCookieStore ,这个类是Apache
HttpClient CookieStore 接口的实现,它可以自动将cookies保存到SharedPreferences 。

如果你需要使用cookie保持认证会话,这将是特别重要的,因为即使用户关掉了应用仍然可以登录状态。

首先,创建一个AsyncHttpClient对象:

AsyncHttpClient myClient = new AsyncHttpClient();

现在将client的Cookie保存到一个PersistentCookieStore,构造方法需要有一个上下文(Activity,Application都可以,通常this就OK了)。

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

所有从server获取到的数据都持续的保存。

如果想自己设定cookie,只需要创建一个新的cookie,并调用addCookie:

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

详情请看 PersistentCookieStore Javadoc

使用RequestParams来添加GET/POST请求参数

类RequestParams 用来为请求添加请求参数,RequestParams 可以有好几种方法进行创建和设置。

1.创建一个空的RequestParams 然后添加参数:

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

2.创建一个带有一对参数的RequestParams

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

3.创建一个带有Map的RequestParams

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

详情请参考:RequestParams Javadoc

使用RequestParams上传文件

RequestParams 可以支持多媒体文件上传,可以通过以下方式实现:

1.将一个Inputstream添加到将要上传的RequestParams

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

2.File方式

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

3.byte数组形式

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

详情:RequestParams Javadoc

使用FileAsyncHttpResponseHandler下载二进制文件

类FileAsyncHttpResponseHandler 可以用来获取二进制文件,如图片,语音等文件:

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

详情: FileAsyncHttpResponseHandler
Javadoc

添加基本的认证凭证

一些请求可能需要类似username/password 的凭证

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

当然你也可以定制

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

详情:RequestParams Javadoc

说明文档:http://loopj.com/android-async-http/

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

MVN地址:http://central.maven.org/maven2/com/loopj/android/android-async-http/

Android Asynchronous Http Client--Android 开源的网络异步加载类

时间: 2024-10-14 19:15:32

Android Asynchronous Http Client--Android 开源的网络异步加载类的相关文章

android 请求网络异步加载

/** * 封装ProecssDialog对话框 * */ public class LoadDialog extends ProgressDialog { private String title = "进度对话框"; private String message = "加载数据中...."; public LoadDialog(Context context, int theme) { super(context, theme); } /** * 用默认的标题和

Android编程之图片(异步)加载类

应某人之请,写一篇关于图片加载类.其实,网上有很多这样的类,而且比较推崇的是来自google中开源中的一篇.他写的比较好了,而且注意了内存优化,下面贴出它的图片下载类: [java] view plaincopy /* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not 

android listview 异步加载图片并防止错位

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

浅谈Android中的异步加载之ListView中图片的缓存及优化三

     隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算有点价值的就是里面的图片的缓存的实现.因为老实说它确实能在实际的项目中得到很好的应用.主要学习来源于慕课网中的异步加载学习,来自徐宜生大神的灵感.本次也就是对大神所讲知识的一个总结及一些个人的感受吧. 这次是一个综合的Demo,主要里面涉及到的知识主要有:网络编程.异步加载.JSON解析.

Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

原文出自:方杰|http://fangjie.sinaapp.com/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不

android listview 异步加载图片并防止错位+双缓存

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

Android 异步加载

Android的Lazy Load主要体现在网络数据(图片)异步加载.数据库查询.复杂业务逻辑处理以及费时任务操作导致的异步处理等方面.在介绍Android开发过程中,异步处理这个常见的技术问题之前,我们简单回顾下Android开发过程中需要注意的几个地方. Android应用开发过程中必须遵循单线程模型(Single Thread Model)的原则.因为Android的UI操作并不是线程安全的,所以涉及UI的操作必须在UI线程中完成.但是并非所有的操作都能在主线程中进行,Google工程师在

Android 异步加载解决方案

Android的Lazy Load主要体现在网络数据(图片)异步加载.数据库查询.复杂业务逻辑处理以及费时任务操作导致的异步处理等方面.在介绍Android开发过程中,异步处理这个常见的技术问题之前,我们简单回顾下Android开发过程中需要注意的几个地方. Android应用开发过程中必须遵循单线程模型(Single Thread Model)的原则.因为Android的UI操作并不是线程安全的,所以涉及UI的操作必须在UI线程中完成.但是并非所有的操作都能在主线程中进行,Google工程师在

Android ListView异步加载图片乱序问题,原因分析及解决方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不