# Android网络请求(4) 网络请求框架Volley
Android网络请求(4) 网络请求框架Volley
Volley是Google在2013年5月15日到17日在旧金山Moscone中心举办网络开发者年会中推出的Android异步网络加载框架和图片加载框架,它特别适合数据体量小且通讯频繁的网络操作场景,而Android开发中大多数场景都是这样的,但是如果让它去进行文件上传下载之类的大数据量网络操作,那么他的表现将非常差。
那么让我们走进Volley,来熟悉一下它最基本的使用吧。值得一提的是,Volley提供了一个图片加载框架NetworkImageView,我们也来一起了解一下吧。
导入依赖
Volley的历史不短,但是它的修改却很少,现在最高的版本也才1.2.1。我们使用的是1.1.1版本,现在build.gradle(app)中的dependencies中导入依赖
implementation group: 'com.android.volley', name: 'volley', version: '1.1.1'
网络请求
Get请求
// 请求地址
String src = "https://www.baidu.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建请求
StringRequest request = new StringRequest(src, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
});
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
直接在MainActivity中进行网络请求,这与我们之前的方式不太一样,这是因为Volley请求代码比OkHtpp还要简短,监听都可以new+空格+回车 自动弹出,我们只需要管理返回的数据即可,而且创建的请求队列并不只能使用一次,这是一个队列,可以加入多个请求,所以,我们只需要创建请求并且导入到这个队列中即可。
Post请求
post请求比get请求多一些参数,首先就是在创建请求时要去指定请求为post,因为默认请求时get,其次需要重写一个方法用于传递post请求所携带的参数,如果不这么做的话,就会报错。
// 请求地址
String src = "https://xxx.xxx.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建请求,添加请求类型
StringRequest request = new StringRequest(Request.Method.POST ,src, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
}){
// post请求一定要传入参数否则报错
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<>();
map.put("username","123456");
map.put("password","123456");
return map;
}
};
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
Put请求
Put请求就不说了,只需要修改请求方法即可
Delete请求
delete请求如果需要携带参数,可以在post请求的基础上修改请求方法,如果不携带参数可以在get请求的基础上添加请求方法。
Json数据请求
我们注意到了,我们返回的都是String类型的值,我们日常开发中返回的值大多数时json格式的,那么我们怎么样去请求json数据呢。Volley提供了JsonObjectRequest和JsonArrayRequest这两个类可用于返回json数据。它的使用方法和StringRequest是一样的,只需要修改一些参数即可。另外他不在需要通过重写方法来传递参数,可以直接将你需要的参数转换成json格式,在实例化JsonObjectRequest时传入
Get请求
// 请求地址
String src = "https://www.baidu.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建请求,添加请求类型
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,src,null, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
});
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
Post
// 请求地址
String src = "https://www.baidu.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建参数
JSONObject data = new JSONObject();
try {
data.put("username","123");
data.put("password","123");
} catch (JSONException e) {
e.printStackTrace();
}
// 创建请求,添加请求类型
// 顺序是 请求方法 请求地址 请求携带的数据 监听器
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,src,data, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
});
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
Put
在post基础上修改请求方法即可
delete
判断是否携带参数并且post或get中修改即可
网络图片加载框架
1、通过ImageRequest请求网络图片
这种方法是通过ImageRequest来请求一张图片转换为Bitmap格式,在返回的Bitmap中对ImageView进行设置图片,较为简单。
img = (ImageView) findViewById(R.id.img);
// 创建链接
String url = "图片链接";
// 创建队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 创建图片请求
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
img.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
// 添加进队列
requestQueue.add(imageRequest);
2、通过Imageloader加载图片
这种方法对比起上一种来说要更加复杂一些,我们需要先新建一个类实现ImageLoader.ImageCache接口
public class BitmapCache implements ImageLoader.ImageCache{
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
//设置图片最大值
int maxSize = 10*1024;
mCache = new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url,bitmap);
}
}
然后再去MainActivity中去创建ImageLoader,它不需要我们去设置图片,只需要将图片作为一个参数传递进去,它会帮我们自动加载进ImageView中。
img = (ImageView) findViewById(R.id.img);
// 创建链接
String url = "图片链接";
// 创建队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 创建图片请求
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
// 设置图片加载监听,设置默认图片和加载错误图片
ImageLoader.ImageListener imageListener = imageLoader.getImageListener(img,R.drawable.edittext_bg,R.drawable.ic_home_black_24dp);
// 发起请求
imageLoader.get(url,imageListener);
3、通过NetworkImageView加载图片
除了使用ImageView加载图片,Volley还提供了一个组件就是NetworkImageView,我们在布局文件上使用它。
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.android.volley.toolbox.NetworkImageView>
它同样需要前面的BitmapCache类,因为他也需要ImageLoder。
img = (NetworkImageView) findViewById(R.id.img);
// 创建链接
String url = "图片地址";
// 创建队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 创建一个ImageLoader
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
// 默认图片和异常图片设置
img.setDefaultImageResId(R.drawable.ic_home_black_24dp);
img.setErrorImageResId(R.drawable.ic_home_black_24dp);
// 加载图片
img.setImageUrl(url,imageLoader);
总结
不管你使用的是Volley框架是单纯的请求数据还是加载图片都要记住,它不适合体量较大的网络请求。
以上三种加载网络图片的方式最终都能得到成果图

# Android网络请求(4) 网络请求框架Volley的更多相关文章
- Android使用Google推荐的联网框架Volley,让连接网络更加简单
大家好.随着技术的进步.科技的发达,非常少有应用是单机的了,大部分都须要联网訪问server,曾经我们都用 httpclient和httpurlconnection,感觉是不是非常麻烦,而Google ...
- 【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法
在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考 ...
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- android -------- OkGo (让网络请求更简单的框架)
项目地址:https://github.com/jeasonlzy 该库是封装了okhttp的网络框架,可以与RxJava完美结合,比Retrofit更简单易用.支持大文件上传下载,上传进度回调,下载 ...
- Android网络框架Volley(体验篇)
Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...
- Android网络框架Volley(实战篇)
之前讲了ym—— Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看如何把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQu ...
- Android网络框架-Volley实践 使用Volley打造自己定义ListView
这篇文章翻译自Ravi Tamada博客中的Android Custom ListView with Image and Text using Volley 终于效果 这个ListView呈现了一些影 ...
- Android网络框架Volley
Volley是Google I/O 2013推出的网络通信库,在volley推出之前我们一般会选择比较成熟的第三方网络通信库,如: android-async-http retrofit okhttp ...
- ym—— Android网络框架Volley(终极篇)
转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103).谢谢支持! 没看使用过Volley的同学能够,先看看Android网络框架Volley(体验篇)和 ...
- Android框架Volley之:ImageRequest请求实现图片加载
首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: < ...
随机推荐
- session 总结
session 总结(单节点场景) session 称作域对象,一般保存在当前服务器的内存中,如果有很多session也会部分不常用的session"钝化"到磁盘中,若磁盘中的se ...
- Git Bash(提交文件到GitHub进行托管)
Introduction 使用Git Bash命令,可以将一个项目上传到Github官网中,进行托管,避免重要文件被误删 1.Git工具下载 Git for Windows 2.在github中新 ...
- 永恒之蓝(MS17-010)漏洞复现
1. 漏洞介绍 永恒之蓝: 恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含"永恒之蓝"工具,"永恒之 ...
- 我也是一个“翻译家”——关于“robust”
每次看到"鲁棒性",总是不知道是什么意思,一度怀疑自己是不是中国人,是不是说汉语.每次都要查英汉字典,然后一次次看到: robust(adj.精力充沛的; 坚定的; 粗野的,粗鲁的 ...
- Elasticsearch 堆内存
转载自:https://www.lbbniu.com/6148.html 1.什么是堆内存? Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中, ...
- KVM下virtio驱动虚拟机XML配置文件分析
[root@opennebula qemu]# pwd /etc/libvirt/qemu [root@opennebula qemu]# ls networks one-12.xml one-12. ...
- 数据结构与算法【Java】08---树结构的实际应用
前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...
- 如何使用 Yolov4 训练人脸口罩检测模型
前言 疫情当下,出入医院等公共场所都被要求佩戴口罩.这篇博客将会介绍如何使用 Yolov4,训练一个人脸口罩检测模型(使用 Yolov4 的原因是目前只复现到了 v4 ),代码地址为 https:// ...
- 洛谷P1962 斐波那契数列 (矩阵快速幂)
学了矩阵,练一下手... 1 #include<bits/stdc++.h> 2 typedef long long ll; 3 const ll mod=1e9+7; 4 using n ...
- 2022-08-12-esp32把玩记-②_用Micropython点ssd1306_oled屏幕
layout: post cid: 8 title: esp32把玩记-② 用Micropython点ssd1306 oled屏幕 slug: 8 date: 2022/08/12 15:12:39 ...