Android学习笔记:Android-Async-Http
阅读原文时间:2021年04月20日阅读:1

对于Android-Async-Http库来说,不推荐使用,原因有两点:
1、作者已停止维护
2、Android5.0后弃用HttpClient,Android-Async-Http是基于HttpClient库之上的网络请求处理库
该篇文章仅供了解学习使用

Android-Async-Http的Github地址:https://github.com/loopj/android-async-http
Android-Async-Http官方文档:loopj.com/android-async-http/
官方文档描述此库的特点:
(1)使用4.3.6以上版本的HttpClient来代替Android提供的DefaultHttpClient
(2)兼容Android API 23及以上
(3)发送异步HTTP请求,处理匿名回调中的响应
(4)非UI线程执行HTTP请求
(5)使用线程池来限制并发资源的使用
(6)使用RequestParams作为GET/POST参数构造器
(7)多部分文件上传不需要其它第三方库
(8)JSON数据流的上传不需要额外的库
(9)能处理循环和相对重定向
(10)应用程序开销很小,总共只有90kb
(11)为移动连接自动智能请求重试优化
(12)支持超快的请求自动gzip响应解码
(13)BinaryHttpResponseHandler支持二进制通信协议
(14)使用JsonHttpResponseHandler将内置响应解析为JSON
(15)使用FileAsyncHttpResponseHandler将响应直接保存到文件中
(16)持久cookie存储,将cookie保存到SharedPreferences中
(17)使用BaseJsonHttpResponseHandler与Jackson JSON、GSON、或其他JSON序列化库集成
(18)使用SaxAsyncHttpResponseHandler支持SAX解析器
(19)支持语言和内容编码,而不仅仅是UTF-8

Android-Async-Http是一个强大的网络请求库,这个库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果。

在Android Studio中不需要下载jar包,直接添加依赖即可:

dependencies {
    compile 'com.loopj.android:android-async-http:1.4.9'
}

接下来再导入http包:

import com.loopj.android.http.*;

一、使用步骤

1、创建AsyncHttpClient对象;
2、如果需要参数,可以创建RequestParams对象添加参数,如果不需要参数,可跳过这一步;
3、按需要调用AsyncHttpClient的某个GET/POST的方法,传递需要的callback接口实现。


二、RequestParams给GET/POST请求添加参数

RequestParams类用于向请求中添加可选的GET或POST参数。RequestParams可以以多种方式构建和构造:

(1)创建空RequestParams并立即添加一些参数

RequestParams params = new RequestParams();
params.put("key1", "value1");
params.put("key2", "value2");

(2)为单个参数创建RequestParams

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

(3)从已存在的key/value映射中创建RequestParams

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

三、AndroidAsyncHttpDemo

项目简介:采用Android-Async-Http框架,通过访问聚合API查询手机归属地
项目地址:https://github.com/ambition-hb/AndroidAsyncHttpDemo
项目图示:

部分代码如下:

/**
 * Android-Async-Http的Get和Post请求的使用
 */

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_get;
    private Button btn_post;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_get = (Button)findViewById(R.id.btn_get);
        btn_post = (Button)findViewById(R.id.btn_post);
        tv = (TextView)findViewById(R.id.tv);
        btn_get.setOnClickListener(this);
        btn_post.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.btn_get:
                Android_Async_Http_Get();
                break;
            case R.id.btn_post:
                Android_Async_Http_Post();
                break;
            default:
                break;
        }
    }

    //Get请求
    private void Android_Async_Http_Get(){
        AsyncHttpClient client = new AsyncHttpClient();
        String url = "http://apis.juhe.cn/mobile/get?phone=13429667914&key=fef8795fcfa0a1977582d8c31b529112";
        client.get(url, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                showResponse(new String(responseBody));
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Toast.makeText(MainActivity.this, "Get请求失败!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    //Post请求
    private void Android_Async_Http_Post(){
        AsyncHttpClient client = new AsyncHttpClient();
        String url = "http://apis.juhe.cn/mobile/get?";
        RequestParams params = new RequestParams();
        params.put("phone", "18826593245");
        params.put("key", "fef8795fcfa0a1977582d8c31b529112");
        client.post(url, params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                showResponse(new String(responseBody));
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Toast.makeText(MainActivity.this, "Post请求失败!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void showResponse(final String response){
        //Activity不允许在子线程中进行UI操作
        //通过该方法可以将线程切换到主线程,然后再更新UI元素
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tv.setText(response);
            }
        });
    }
}