赞
踩
之前学习了一款安卓的网络通信框架Volley
https://blog.csdn.net/nishigesb123/article/details/89356776
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是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果,目前非常火的应用Instagram就是用的这个网络请求库。
其主要特征如下:
官方地址: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'
第一步还是网络权限,下面所有案例基本相同,涉及网络的都需要!
<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("https://blog.csdn.net", 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盘了
下载二进制数据案例
控制台输出:
打开文件管理器,可以看到,已经下载成功了,第一张图 ,观察名字 (:
- //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();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。