Android网络请求框架volley 的原理的与使用

Android网络请求框架volley 的原理的与使用

很多人可能会说,这都什么年代了,还用Volley,我们现在都是用OKhttp、xutils3.0、rxjava、MVP+Retrofit+RxJava 等网络请求框架,但是今天我还是想说说这个经典的网络请求框架。

  • volley的简介
  • volly的优缺点
  • volley的使用
  • Volley的使用总结

volley的简介

我们平时在开发 Android 应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用 HTTP协议来发送和接收网络数据。Android 系统中主要提供了两种方式来进行 HTTP 通信,HttpURLConnection 和HttpClient,几乎在任何项目的代码中我们都能看到这两个类 的身影,使用率非常高。但是Android 6.0之后把HttpClient废弃了,Volly也是基于HttpClient创建的,不过如果你想继续使用HttpClient,谷歌官方也给出了解决方案。

由于 HttpURLConnection 和 HttpClient 的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是 乎,一些 Android 网络通信框架也就应运而生,比如说 AsyncHttpClient,它把 HTTP 所
有 的 通 信 细 节 全 部 封 装 在 了 内 部 , 我 们 只 需 要 简 单 调 用 几 行 代 码 就 可 以 完 成 通 信 操 作 了 。 再 比 如
Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关 心如何从网络上获取
图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader 已经把一切都做好了。
Android 开发团队也是意识到了有必要将 HTTP 的通信操作再进行简单化,于是在2013年 Google I/O 大会上
推出了一个新的网络通信框架——Volley。Volley 可是说是把 AsyncHttpClient 和 Universal-Image- Loader 的优点
集于了一身,既可以像 AsyncHttpClient 一样非常简单地进行 HTTP 通信,也可以像 Universal-Image- Loader 一样
轻松加载网络上的图片。
这里写图片描述

翻译:
Apache HTTP客户端删除
Android 6.0版本将支持Apache HTTP客户端。如果你的应用程序使用此客户端和目标Android 2.3(API级别9)或更高,使用HttpURLConnection类。这个API是更有效的,因为它通过透明的压缩和响应缓存,减少网络使用和减少能耗。继续使用Apache HTTP api,你必须首先声明以下编译时依赖项。gradle文件:

Volly的优缺点

  • 优点

    使用简单,Volley 在性能方面也进行了大幅度的调整,它的设计目标就是非常适合
    去进行数据量不大,所以网络通信频繁的,非常适合使用 Volley

  • 缺点

    而对于大数据量的网络操作,比如说下载文件等,Volley 的表现就会非
    常糟糕

下图所示的这些应用都是属于数据量不大,但网络通信频繁的
这里写图片描述

Volley的使用

  • 下载源码,导入你的工程
  • 网络请求无非也就这么几步

    A.创建网络请求对象
    B.执行网络请求方法
    C.在方法中传入请求方式以及参数
    D.异步回调接收网络请求的结果

  • StringRequest 的用法

前面已经说过,Volley 的用法非常简单,那么我们就从最基本的 HTTP 通信开始学习吧,即发起一条 HTTP 请求,然后接收 HTTP 响应。首先需要获取到一个 RequestQueue 对象,可以调用如下方法获取到:RequestQueue mQueue = Volley.newRequestQueue(context);
注 意这里拿到的 RequestQueue 是一个请求队列对象,它可以缓存所有的 HTTP 请求,然后按照一定的算法并发地、发出这些请求。 RequestQueue 内部的设计就是非常合适高并发的,因此我们不必为每一次 HTTP 请求都创建一个RequestQueue 对象,这是非常浪费资源 的,基本上在每一个需要和网络交互的 Activity 中创建一个 RequestQueue对象就足够了。

接下来为了要发出一条 HTTP 请求,我们还需要创建一个 StringRequest 对象,如下所示:

StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});

可以看到,这里 new 出了一个 StringRequest 对象,StringRequest 的构造函数需要传入三个参数,第一个参数就是目标服务器的 URL 地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址我们填写的是百度的首页,然后在响应成功的回调里打印 出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。最后,将这个 StringRequest 对象添加到 RequestQueue 里面就可以了,如下所示:
mQueue.add(stringRequest);另外,由于 Volley 是要访问网络的

因此不要忘记在你的 AndroidManifest.xml 中添加如下权限:

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

Volley的使用总结

A. 创建一个 RequestQueue 对象。
B. 创建一个 StringRequest 对象。
C. 将 StringRequest 对象添加到 RequestQueue 里面

不过大家都知道,HTTP 的请求类型通常有两种,GET 和 POST,刚才我们使用的明显是一个 GET 请求,那么如果想要发出一条 POST 请求应该怎么做 呢?StringRequest 中还提供了另外一种四个参数的构造函数,其中第一个参数就是指定请求类型的,我们可以使用如下方式进行指定:
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
可是这只是指定了 HTTP 请求方式是 POST,那么我们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest 中并没有提供设置 POST 参数的方法,但是当发出 POST 请求的时候,Volley 会尝试调用StringRequest 的父类——Request 中的 getParams()方法 来获取 POST 参数,那么解决方法自然也就有了,我们只需要在 StringRequest 的匿名类中重写 getParams()方法,在这里设置 POST 参数就可以了,代码如下所示:

tringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("params1", "value1");
map.put("params2", "value2");
return map;
}
};

补充

JsonRequest 的用法
学完了最基本的 StringRequest 的用法,我们再来进阶学习一下 JsonRequest 的用法。类似于 StringRequest,
JsonRequest 也是继承自 Request 类的,不过由于 JsonRequest 是一个抽象类,因此我们无法直接创建 它的实例,
那么只能从它的子类入手了。JsonRequest 有两个直接的子类,JsonObjectRequest 和 JsonArrayRequest,从名字
上你应该能就看出它们的区别了吧?一个是用于请求一段 JSON 数据的,一个是用于请求一段 JSON 数组的。
至于它们的用法也基本上没有什么特殊之处,先 new 出一个 JsonObjectRequest 对象,如下所示:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/
101010100.html", null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});

可以看到,这里我们填写的 URL 地址是 http://m.weather.com.cn/data/101010100.html,这是中国天气网提
供的一 个查询天气信息的接口,响应的数据就是以 JSON 格式返回的,然后我们在 onResponse()方法中将返回的数
据打印出来。
最后再将这个 JsonObjectRequest 对象添加到 RequestQueue 里就可以了,如下所示:
mQueue.add(jsonObjectRequest);
这样当 HTTP 通信完成之后,服务器响应的天气信息就会回调到 onResponse()方法中,并打印出来。现在运行一
下程序,发出这样一条 HTTP 请求,就会看到 LogCat 中会打印出如下图所示的数据。
由此可以看出,服务器返回给我们的数据确实是 JSON 格式的,并且 onResponse()方法中携带的参数也正是一
个 JSONObject 对象,之后只需要从 JSONObject 对象取出我们想要得到的那部分数据就可以了。
你应该发现了吧,JsonObjectRequest 的用法和 StringRequest 的用法基本上是完全一样的,Volley 的易用之处
也在这里体现 出来了,会了一种就可以让你举一反三,因此关于 JsonArrayRequest 的用法相信已经不需要我再去讲
解了吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值