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
点击下载后导入工程中libs文件夹下并添加到工程路径即可使用。
当然...Android Studio也是找的到的....
正如?提到的,考虑到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));
}
});
}
}
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));
}
});
}
客户端:
不知道是不是有什么问题,还是本身就这么慢,响应有点慢
服务器端:
上传文件
这个案例需要配置权限!不难理解但是很容易忘记,一开始一直失败,百思不得其解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));
}
});
}
效果: (省略了部分内容)
然后服务器是在本机上,没有特地设置相对路径,就直接保存在E盘了
FileAsyncHttpResponseHandler
下载二进制数据案例
控制台输出:
打开文件管理器,可以看到,已经下载成功了,第一张图 ,观察名字 (:
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();
}
}