Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

  最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发。在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所帮助。

  首先按照惯例先来简单了解一些AsyncHttpClient网络框架的一些知识。

1、简介

  Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-async-http这个库可以大大的简化操作,它是基于Apache’s HttpClient ,所有的请求都是独立在UI主线程之外,通过回调方法处理请求结果,采用android  Handler message 机制传递信息。

2、特性

(1)采用异步http请求,并通过匿名内部类处理回掉结果

(2)http请求独立在UI主线程之外

(3)采用线程池来处理并发请求

(4)采用RequestParams类创建GET/POST参数

(5)不需要第三方包即可支持Multipart file文件上传

(6)大小只有25kb

(7)自动为各种移动电话处理连接断开时请求重连

(8)超快的自动gzip响应解码支持

(9)使用BinaryHttpResponseHandler类下载二进制文件(如图片)

(10)使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式(下面会重点讲解JsonHttpResponseHandler在使用过程中存在的问题)

(11)持久化cookie存储,可以将cookie保存到你的应用程序的SharedPreferences中

以上的理论源于网友的博客,有兴趣的朋友如果想了解更多的关于AsyncHttpClient的理论知识可以去参考一下这位网友的博客

《Android网络请求框架AsyncHttpClient详解》:http://blog.csdn.net/xiaohui2015/article/details/51462782

3、使用办法

  在讲解实例之前,请先看接口文档,结合接口文档和实例学习起来更清晰。

用户登录接口文档:

接口地址:http://xxx.xxx.xxx/MobileService/userLogin

备注:

请求参数:

{

  username:”用户登录”,

  password:”密码”

}

返回结果:

{

  “code”:”状态码”,1000 返回成功 其他失败

  “message”:”提示信息”,

  “data”:{

      userid:”用户id”,

      supplier:”供应商id”,

      suppliername:”供应商名称”

    }

}

1 usercount = (EditText) findViewById(R.id.usernumber);
2 password = (EditText) findViewById(R.id.password);

下面代码中的usercount和password是我在界面中定义的两个EditText类型的控件。用来输入用户的账号和密码。

 1         AsyncHttpClient client = new AsyncHttpClient();
 2         String url = "http://xxx.xxx.xxx/MobileService/userLogin";
 3         // 使用RequestParams来向接口发送请求的参数,结合接口文档可以看出我要向服务器发送的参数为username和password
 4         RequestParams params = new RequestParams();
 5         params.put("username", usercount.getText().toString());
 6         params.put("password", password.getText().toString());
 7         // 请注意,在这里我是用的是AsyncHttpResponseHandler来进行网络处理,而没有使用JsonHttpResponseHandler来进行处理,原因在下面讲明。
 8         //另外需要注意的是这里一定要用post方式提交,而且在client.的时候千万不要忘记选择带参数params的post,否则你拿什么和服务器交流?我就翻过这样的错误。
 9         client.post(url, params, new AsyncHttpResponseHandler() {
10
11             @Override
12             public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
13                 // TODO Auto-generated method stub
14                 try {
15                     // 从服务器中接收返回的数据,并进行字符集设置,返回的结果集放resultDate中,resultDate相当于一个容器,所有的返回信息都在其中。只要用过JSON解析出来返回值并逐个获取返回值就OK了。
16                     // 不要问我为什么这么使用,我也不知道。只清楚这么好用。
17                     String resultDate = new String(arg2, "utf-8");
18                     // 结合接口文档可以看出返回的结果都是单个的,没有返回的是集合或数组这样多个的情况,所以直接用JSONObject来接受返回值即可
19                     JSONObject js = new JSONObject(resultDate);
20                     // 将code、message、data解析出来。对于返回值是单个的而不是集合或数组的取值方式有两种。1:js.getJSONObject("xxx");2:js.getString("xxx");xxx代表任意String类型的字符串
21                     //通过接口文档可以看出,返回值都是String类型的数据,所以我在这里选择了第二种取值方式,如果使用第一种会造成类型不匹配而导致程序错误。
22                     String code = js.getString("code");
23                     String message = js.getString("message");
24                     String data = js.getString("data");
25                     //对data中的数据进行进一步的解析,原理同上面一样
26                     JSONObject jsonObject = new JSONObject(data);
27                     String userid = jsonObject.getString("userid");
28                     String supplier = jsonObject.getString("supplier");
29                     String suppliername = jsonObject.getString("suppliername");
30                     //1000代表状态码,表示登陆成功
31                     if ("1000".equals(code)) {
32                         //使用SharedPreferences将用户的账户和密码存储起来,关于SharedPreferences的存储知识请参考我的另外一篇文章
33                         SharedPreferences sharedPreferences = getSharedPreferences(
34                                 message, Activity.MODE_PRIVATE);
35                         Editor editor = sharedPreferences.edit();
36                         editor.putString("username", usercount.getText()
37                                 .toString());
38                         editor.putString("password", password.getText()
39                                 .toString());
40                         editor.commit();
41                         Intent intent = new Intent(getApplicationContext(),
42                                 MainActivity.class);
43                         intent.putExtra("userid", userid.toString());
44                         startActivity(intent);
45                     } else {
46                         Toast.makeText(getApplicationContext(), "账号或密码错误",
47                                 Toast.LENGTH_LONG).show();
48                     }
49                 } catch (UnsupportedEncodingException e) {
50                     // TODO Auto-generated catch block
51                     e.printStackTrace();
52                 } catch (JSONException e) {
53                     // TODO Auto-generated catch block
54                     e.printStackTrace();
55                 }
56
57             }
58
59             @Override
60             public void onFailure(int arg0, Header[] arg1, byte[] arg2,
61                     Throwable arg3) {
62                 // TODO Auto-generated method stub
63                 Toast.makeText(getApplicationContext(), "请检查网络!",
64                         Toast.LENGTH_SHORT).show();
65             }
66         });
67     

上面的代码是通过AsyncHttpResponseHandler()来处理服务器的返回值的,AsyncHttpClient中还有一个用来处理服务器的返回值,我看大多数博客都写的是这个JsonHttpResponseHandler()。

JsonHttpResponseHandler()来处理服务器返回值的代码如下:

 1         AsyncHttpClient client = new AsyncHttpClient();
 2         String url = "http://xxx.xxx.xxx/MobileService/userLogin";
 3         RequestParams params = new RequestParams();
 4         params.put("username", usercount.getText().toString());
 5         params.put("password", password.getText().toString());
 6         client.post(url, params, new JsonHttpResponseHandler() {
 7             @Override
 8             public void onSuccess(int statusCode, Header[] headers,
 9                     JSONObject response) {
10                 // TODO Auto-generated method stub
11                 super.onSuccess(statusCode, headers, response);
12                 try {
13                     JSONObject js = new JSONObject(response.toString());
14                     String code = js.getString("code");
15
16                     String message = js.getString("message");
17                     String data = js.getString("data");
18
19                     JSONObject jsonObject = new JSONObject(data);
20                     String userid = jsonObject.getString("userid");
21                     String supplier = jsonObject.getString("supplier");
22                     String suppliername = jsonObject.getString("suppliername");
23
24                     if ("1000".equals(code)) {
25                         SharedPreferences sharedPreferences = getSharedPreferences(
26                                 message, Activity.MODE_PRIVATE);
27                         Editor editor = sharedPreferences.edit();
28                         editor.putString("username", usercount.getText()
29                                 .toString());
30                         editor.putString("password", password.getText()
31                                 .toString());
32                         editor.commit();
33                         Intent intent = new Intent(getApplicationContext(),
34                                 MainActivity.class);
35                         intent.putExtra("userid", userid.toString());
36                         startActivity(intent);
37                     } else {
38                         Toast.makeText(getApplicationContext(), "账号或密码错误",
39                                 Toast.LENGTH_LONG).show();
40                     }
41
42                 } catch (JSONException e) {
43                     // TODO Auto-generated catch block
44                     e.printStackTrace();
45                 }
46             }
47
48             @Override
49             public void onFailure(int statusCode, Header[] headers,
50                     Throwable throwable, JSONArray errorResponse) {
51                 // TODO Auto-generated method stub
52                 super.onFailure(statusCode, headers, throwable, errorResponse);
53                 Toast.makeText(getApplicationContext(), "请检查网络!",
54                         Toast.LENGTH_SHORT).show();
55             }
56         });
57     

请看第6行和第9行代码,第6行代码就是使用JsonHttpResponseHandler()来处理传回的数据的。第9行代码中的参数response就是上面特性中的第10条:使用JsonHttpResponseHandler类可以自动将响应结果解析为json格式。使用JsonHttpResponseHandler()虽然很方便,但是却存在着很大的问题。JsonHttpResponseHandler()在使用过程中有时莫名的出现请求不了服务器的情况,就是onSuccess和onFailure方法都进不去,这样就直接造成了程序无法正常使用。如果你不信你可以试试,明明前几分钟你使用JsonHttpResponseHandler()处理返回数据还好用呢,而你在这期间根本没有动过其中的代码,JsonHttpResponseHandler就莫名其妙的不好用了,而且原因不知道,无论你怎么调试都不成功。相反AsyncHttpResponseHandler()则根本不存在这样的问题。所以我就果断的放弃使用JsonHttpResponseHandler(),而采用AsyncHttpResponseHandler()来处理返回数据。当然AsyncHttpClient当中还封装了不少别的用来处理响应的方法,因为别的本人没有使用过,具体怎么样我也不知道。如果有使用过别的方法的朋友可以在下面留言告诉我,我们好相互学习。

对于接口返回值是数组或集合的形式有不会的朋友可以参照下面的代码,我就不解释了,反正是照着代码直接写肯定没有问题。

 1         AsyncHttpClient client = new AsyncHttpClient();
 2         String url = "http://xxx.xxx.xxx/MobileService/userLogin";
 3         RequestParams params = new RequestParams();
 4         params.add("userid", userid);
 5         client.post(url, params, new AsyncHttpResponseHandler() {
 6
 7             @Override
 8             public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
 9                 // TODO Auto-generated method stub
10                 try {
11                     String resultDate = new String(arg2, "utf-8");
12                     JSONObject js1 = new JSONObject(resultDate);
13                     String code = js1.getString("code");
14                     String message = js1.getString("message");
15                     String data = js1.getString("data");
16                     JSONObject js2 = new JSONObject(data);
17                     if ("1000".equals(code)) {
18                         String productlist = js2.getString("productlist");
19                         JSONArray array = new JSONArray(productlist);//productlist返回的数据就是一个集合
20                         //List<Map<String, Object>> arrays,这个在全局变量中进行声明。
21               arrays = new ArrayList<Map<String, Object>>();
22                         for (int i = 0; i < array.length(); i++) {
23                             JSONObject js3 = array.getJSONObject(i);
24                             String batchnumber = js3.getString("batchnumber");
25                             HashMap<String, Object> map = new HashMap<String, Object>();
26                             map.put("batchnumber", batchnumber);
27                             arrays.add(map);
28                         }
29                         System.out.println("arrays:" + arrays);
30                        33                     }
34
35                 } catch (UnsupportedEncodingException e) {
36                     Log.e("log_tag",
37                             "Error parsing classname data" + e.toString());
38                 } catch (JSONException e) {
39                     // TODO Auto-generated catch block
40                     Log.e("log_tag", "Request failed" + e.toString());
41                 }
42             }
43
44             @Override
45             public void onFailure(int arg0, Header[] arg1, byte[] arg2,
46                     Throwable arg3) {
47                 // TODO Auto-generated method stub
48                 Toast.makeText(getApplicationContext(), "服务异常",
49                         Toast.LENGTH_SHORT).show();
50             }
51         });
52     

关于AsyncHttpClient网络框架的使用我的了解就是这么多了,关于JsonHttpResponseHandler()有时候不好用的问题如果谁知道怎么回事欢迎留言告诉我,鄙人感激不尽。希望这篇博客对大家有所帮助。

时间: 2025-01-02 18:08:30

Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)的相关文章

android网络请求库volley方法详解

使用volley进行网络请求:需先将volley包导入androidstudio中 File下的Project Structrue,点加号导包 volley网络请求步骤: 1. 创建请求队列       RequestQueue queue = Volley.newRequestQueue(this); 2.创建请求对象(3种) StringRequest request = new StringRequest(“请求方法”,“请求的网络地址”,“成功的网络回调”,“失败的网络回调”): Ima

【Java&amp;Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同时支持同步和异步请求)开篇

在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正式开篇来详细介绍这个库的实现,同时结合源码探讨如何设计一个优雅的Android网络请求框架.做过一段时间Android开发的同学应该对这个库不陌生,因为它对Apache的HttpClient API的封装使得开发者可以简洁优雅的实现网络请求和响应,并且同时支持同步和异步请求. 网络请求框架一般至少需要具备如下几个组件:1

boost asio异步读写网络聊天程序客户端 实例详解

// // chat_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://ww

Python网络请求urllib和urllib3详解

Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了urllib. 而urllib3则是增加了连接池等功能,两者互相都有补充的部分. urllib urllib作为Python的标准库,基本上涵盖了基础的网络请求功能. urllib.request urllib中,request这个模块主要负责构造和发起网络请求,并在其中加入Headers.Proxy等. 发

Android网络请求框架 Volley 你所要知道的一切

Volley是2013年谷歌官方推出的Android平台的网络通信库,Volley适用于并发和对效率.性能要求比较高的场景. 1.Volley的特点 优点: (1)使通信更快.更简单 (2)高效的get.post网络请求以及网络图像的高效率异步处理请求 (3)能对网络请求进行排序.优先级处理 (4)网络图片加载和缓存 (5)多级别取消请求,当有多个网络请求同时进行的时候,可以进行同时取消操作 (6)和Activity生命周期的联动,当Activity结束销毁时,可以同时取消网络请求操作 (7)性

Volley网络请求框架简析——Android网络请求框架(三)

题记-- 人来到这个世界上,只有两件事情,生与死, 一件事完了,另一件事还急什么? 有缘而来,无缘而去, 识自本心,见自本性 不起妄缘,无心无为 自由自在,动静自如 冷暖自知,则是修行 1.初始化一个消息请求队列以及网络请求工具类对象 /** * Created by androidlongs on 16/7/1. * 网络请求访问框架 */ public class VollyRequestUtils { /** * Volley框架使用工具类对象 */ private static Voll

 iOS 网络请求缓存:NSURLCache详解

我读过一些开源项目的网络请求缓存的代码,基本上都是采用在本地存文件的方式进行缓存.如果你打算在你的项目中加入网络请求的缓存,可能你并不需要自己造一个轮子,了解一下 NSURLCache 就足够.本文为大家接收的就是ios开发中的NSURLCache相关使用,一起来看看吧. 缓存 首先, NSURLCache 提供的是内存以及磁盘的综合缓存机制.许多文章谈到,使用NSURLCache 之前需要在 AppDelegate 中缓存空间的设置: - (BOOL)application:(UIApplic

Android网络请求框架—OKHttp 源码解析

总体流程 整个流程是,通过OkHttpClient将构建的Request转换为Call,然后在RealCall中进行异步或同步任务,最后通过一些的拦截器interceptor发出网络请求和得到返回的response. 将流程大概是这么个流程,大家可以有个大概的印象,继续向下看: OkHttp流程图.jpg 为了让大家有更深的印象,我准备追踪一个GET网络请求的具体流程,来介绍在源码中发生了什么. GET请求过程 这是利用OkHttp写一个Get请求步骤,这里是一个同步的请求,异步的下面也会说:

selenium+python做web端自动化测试框架与实例详解教程

最近受到万点暴击,由于公司业务出现问题,工作任务没那么繁重,有时间摸索selenium+python自动化测试,结合网上查到的资料自己编写出适合web自动化测试的框架,由于本人也是刚刚开始学习python,这套自动化框架目前已经基本完成了所以总结下编写的得失,便于以后回顾温习,有许多不足的的地方,也遇到了各种奇葩问题,希望大神们多多指教. 首先我们要了解什么是自动化测试,简单的说编写代码.脚本,让软件自动运行,发现缺陷,代替部分的手工测试.了解了自动化测试后,我们要清楚一个框架需要分那些模块: