Volley是谷歌官方推出的,而本文介绍的Android-async-http也是一个网络通信框架(准确点,网络请求框架)不过是第三方的。

之前学习了Apache HTTP Client,说Apache HTTP Client已经“过时”,Android5.1后废止了HttpClient的相关Api,而Android-async-http库正是基于Apache HTTP Client构建的,为了响应政策

android-async-http-1.4.9版本也去除了httpclient的东西

所以?的案例会遇到点小问题,建议使用更低版本的android-async-http jar包,硬要使用的话,得手动准备httpclient的jar包,当然引入的方式很多,下面正文部分提供了一种参考。


Android-async-http

概述

android-async-http是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果,目前非常火的应用Instagram就是用的这个网络请求库。
其主要特征如下:

  • 处理异步Http请求,并通过匿名内部类处理回调结果
  • Http异步请求均位于非UI线程,不会阻塞UI操作
  • 通过线程池处理并发请求处理文件上传、下载
  • 响应结果自动打包JSON格式自动处理连接断开时请求重连

官方地址:http://loopj.com/android-async-http

Android Retrofit网络请求框架封装 安卓http框架_android

点击下载后导入工程中libs文件夹下并添加到工程路径即可使用。

当然...Android Studio也是找的到的....

Android Retrofit网络请求框架封装 安卓http框架_System_02

正如?提到的,考虑到1.4.9删除了一些必要西,最优引入方案

在Gradle中添加依赖 

implementation 'com.loopj.android:android-async-http:1.4.9'
implementation 'cz.msebera.android:httpclient:4.3.6'

 


发送一个异步请求

GET请求

第一步还是网络权限,下面所有案例基本相同,涉及网络的都需要!

<uses-permission android:name="android.permission.INTERNET"/>
package com.example.a4_17android_async_http;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;

import cz.msebera.android.httpclient.Header;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //发送一个简单的GET请求
    public void sendGet(View view) {
        //发送请求客户端
        AsyncHttpClient client = new AsyncHttpClient();
        //调用其get方法,参数1 URL
        client.get("", new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                //200 OK
                String info = new String(responseBody);
                System.out.println(info);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                System.out.println("error:"+new String(responseBody));
            }
        });
    }
}

Android Retrofit网络请求框架封装 安卓http框架_android-async-http_03

post请求变化不大,调用client的post方法即可。

请求参数设置

//创建RequestParams添加请求参数
RequestParams params = new RequestParams();
params.put("key","value");
params.put("more","data");
//添加一个参数可使用
RequestParams params = new RequestParams("single","value");
//使用Map添加参数
HashMap<String,String> paramMap = new HashMap<String,String>();
paramMap.put("key","value");
RequestParams params = new RequestParams(paramMap);
//发送一个带参数的请求
    public void sendParams(View view) {
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        params.put("username", "admin");
        params.put("password", "admin");
        client.post(this, "http://10.0.2.2:8080/contact", params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                System.out.println(new String(responseBody));
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                System.out.println(new String(responseBody));
            }
        });
    }

Android Retrofit网络请求框架封装 安卓http框架_System_04

客户端:

不知道是不是有什么问题,还是本身就这么慢,响应有点慢

Android Retrofit网络请求框架封装 安卓http框架_android_05

服务器端:

Android Retrofit网络请求框架封装 安卓http框架_android_06


上传文件

这个案例需要配置权限!不难理解但是很容易忘记,一开始一直失败,百思不得其解orz

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

//添加一个文件流
InputStream myInputStream=blah;
RequestParams params=new RequestParams();
params.put("secret_passwords",myInputStream,"password.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-wilf.mp3");

完整案例:

//上传文件
    public void upload(View view) {
        AsyncHttpClient client = new AsyncHttpClient();
        RequestParams params = new RequestParams();
        params.put("description", "描述");
        try {
            //拿到相对应的目录
            String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/test.jpg";
            //设置文件
            params.put("myfile", new File(path), "image/jpeg");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        client.post(this, "http://10.0.2.2:8080/contact/upload", params, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                System.out.println("成功");
                //System.out.println(new String(responseBody));
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                System.out.println("失败");
                //System.out.println(new String(responseBody));
            }
        });
    }

 

效果: (省略了部分内容)

Android Retrofit网络请求框架封装 安卓http框架_ide_07

Android Retrofit网络请求框架封装 安卓http框架_android_08

然后服务器是在本机上,没有特地设置相对路径,就直接保存在E盘了

Android Retrofit网络请求框架封装 安卓http框架_android-async-http_09


 

FileAsyncHttpResponseHandler

下载二进制数据案例

Android Retrofit网络请求框架封装 安卓http框架_android-async-http_10

控制台输出:

Android Retrofit网络请求框架封装 安卓http框架_ide_11

打开文件管理器,可以看到,已经下载成功了,第一张图 ,观察名字 (:

Android Retrofit网络请求框架封装 安卓http框架_ide_12


JsonHttpResponseHandler

//JSON请求
    public void json(View view) {
        AsyncHttpClient client = new AsyncHttpClient();
        String url = "http://10.0.2.2:8080/contact/upload";
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("username", "admin");
            jsonObject.put("password", "admin");
            StringEntity entity = new StringEntity(jsonObject.toString());
            client.post(this, url, entity, "application/json", new JsonHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                    super.onSuccess(statusCode, headers, response);
                    System.out.println(response.toString());
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }