当前位置:   article > 正文

安卓网络编程——Android-async-http(网络通信框架)_com.loopj.android:android-async-http

com.loopj.android:android-async-http

之前学习了一款安卓的网络通信框架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

概述

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中添加依赖 

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

 


发送一个异步请求

GET请求

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

<uses-permission android:name="android.permission.INTERNET"/>
  1. package com.example.a4_17android_async_http;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import com.loopj.android.http.AsyncHttpClient;
  6. import com.loopj.android.http.AsyncHttpResponseHandler;
  7. import cz.msebera.android.httpclient.Header;
  8. public class MainActivity extends AppCompatActivity {
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. }
  14. //发送一个简单的GET请求
  15. public void sendGet(View view) {
  16. //发送请求客户端
  17. AsyncHttpClient client = new AsyncHttpClient();
  18. //调用其get方法,参数1 URL
  19. client.get("https://blog.csdn.net", new AsyncHttpResponseHandler() {
  20. @Override
  21. public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
  22. //200 OK
  23. String info = new String(responseBody);
  24. System.out.println(info);
  25. }
  26. @Override
  27. public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
  28. System.out.println("error:"+new String(responseBody));
  29. }
  30. });
  31. }
  32. }

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

请求参数设置

  1. //创建RequestParams添加请求参数
  2. RequestParams params = new RequestParams();
  3. params.put("key","value");
  4. params.put("more","data");
  1. //添加一个参数可使用
  2. RequestParams params = new RequestParams("single","value");
  1. //使用Map添加参数
  2. HashMap<String,String> paramMap = new HashMap<String,String>();
  3. paramMap.put("key","value");
  4. RequestParams params = new RequestParams(paramMap);
  1. //发送一个带参数的请求
  2. public void sendParams(View view) {
  3. AsyncHttpClient client = new AsyncHttpClient();
  4. RequestParams params = new RequestParams();
  5. params.put("username", "admin");
  6. params.put("password", "admin");
  7. client.post(this, "http://10.0.2.2:8080/contact", params, new AsyncHttpResponseHandler() {
  8. @Override
  9. public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
  10. System.out.println(new String(responseBody));
  11. }
  12. @Override
  13. public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
  14. System.out.println(new String(responseBody));
  15. }
  16. });
  17. }

客户端:

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

服务器端:


上传文件

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

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

  1. //添加一个文件流
  2. InputStream myInputStream=blah;
  3. RequestParams params=new RequestParams();
  4. params.put("secret_passwords",myInputStream,"password.txt");
  5. //添加一个文件对象
  6. File myFile=new File("/path/to/file.png");
  7. RequestParams params=new RequestParams();
  8. try {
  9. params.put("profile_picture",myFile);
  10. } catch (FileNotFoundException e) {}
  11. //添加一个字节数组
  12. byte[] myByteArray=blah;
  13. RequestParams params=new RequestParams();
  14. params.put("soundtrack",new ByteArrayInputStream(myByteArray),"she-wilf.mp3");

完整案例:

  1. //上传文件
  2. public void upload(View view) {
  3. AsyncHttpClient client = new AsyncHttpClient();
  4. RequestParams params = new RequestParams();
  5. params.put("description", "描述");
  6. try {
  7. //拿到相对应的目录
  8. String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/test.jpg";
  9. //设置文件
  10. params.put("myfile", new File(path), "image/jpeg");
  11. } catch (FileNotFoundException e) {
  12. e.printStackTrace();
  13. }
  14. client.post(this, "http://10.0.2.2:8080/contact/upload", params, new AsyncHttpResponseHandler() {
  15. @Override
  16. public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
  17. System.out.println("成功");
  18. //System.out.println(new String(responseBody));
  19. }
  20. @Override
  21. public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
  22. System.out.println("失败");
  23. //System.out.println(new String(responseBody));
  24. }
  25. });
  26. }

 

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

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


 

FileAsyncHttpResponseHandler

下载二进制数据案例

控制台输出:

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


JsonHttpResponseHandler

  1. //JSON请求
  2. public void json(View view) {
  3. AsyncHttpClient client = new AsyncHttpClient();
  4. String url = "http://10.0.2.2:8080/contact/upload";
  5. JSONObject jsonObject = new JSONObject();
  6. try {
  7. jsonObject.put("username", "admin");
  8. jsonObject.put("password", "admin");
  9. StringEntity entity = new StringEntity(jsonObject.toString());
  10. client.post(this, url, entity, "application/json", new JsonHttpResponseHandler() {
  11. @Override
  12. public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
  13. super.onSuccess(statusCode, headers, response);
  14. System.out.println(response.toString());
  15. }
  16. });
  17. } catch (JSONException e) {
  18. e.printStackTrace();
  19. } catch (UnsupportedEncodingException e) {
  20. e.printStackTrace();
  21. }
  22. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/496983
推荐阅读
相关标签
  

闽ICP备14008679号