Android热门网络框架Volley详解
.Volley简介
volley的英文意思为‘群发’、‘迸发’。Volley是2013年谷歌官方发布的一款Android平台上的网络通信库。Volley非常适合一些数据量不大,但需要频繁通信的网络操作。使用Volley进行网络开发可以使我们的开发效率得到很大的提升,而且性能的稳定性也比较高。但是Volley不适用于文件的上传下载操作。
Volley的特点:
>1 使网络通信更快,更简单,更健壮;
>2 Get/Post网络请求及网络图像的高效率异步请求;
>3 可以对网络请求的优先级进行排序处理;
>4 可以进行网络请求的缓存;
>5 可以取消多级别请求;
>6 可以和Activity生命周期联动。
为什么要使用Volley?
功能上:
高效的Get/Post方式的数据请求交互;
网络图片的加载和缓存过程简单化。
其他:
谷歌官方推出的,比较权威;
性能很稳定、强劲。
.使用Volley
1.Volley的网络请求队列建立与取消队列请求
使用Volley需要建立一个全局的请求队列,这样我们就可以将一个请求加入到这个全局队列中,并可以管理整个APP的所有请求,包括取消一个或所有的请求。
2.Volley的Get和Post请求方式的使用
Volley的Get和Post请求方式其实是对Android原生Get和Post请求方式进行了二次封装,对效率等进行优化。在使用Get和Post请求方式之前,我们要确定所请求的数据返回什么对象,Volley自带了三种返回类型:
StringRequest:主要使用在对请求数据的返回类型不确定的情况下,StringRequest涵盖了JsonObjectRequest和JsonArrayRequest。
JsonObjectRequest:当确定请求数据的返回类型为JsonObject时使用。
JsonArrayRequest:当确定请求数据的返回类型为JsonArray时使用。
3.Volley与Activity生命周期的联动
简单来说就是Volley中的请求是与Activity的生命周期进行关联。这样可以在Android销毁时关闭Volley的请求,防止请求在后台运行造成内存溢出等情况发生。与Activity生命周期进行联动时需要设置Tag标签,因为取消请求需要在请求队列中通过Tag标签进行查找,在Activity的onStop中执行取消请求的操作。
下面通过代码进行实例的演示。
使用Volley前需要往项目中导入Volley的jar包。没有的可以直接点此下载:volley.jar
首先我们需要自定义一个Application用于创建一个全局的请求队列。
MyApplication.java

public class MyApplication extends Application{
private static RequestQueue queues ;
@Override
public void onCreate() {
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueues() {
return queues;
}
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.cbt.learnvolley"
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 添加网络操作权限 -->
<uses-permission android:name="android.permission.INTERNET"/> <!-- 注册自定义的Application:android:name=".MyApplication" -->
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application> </manifest>

.使用Get方式请求数据返回StringRequest对象
当想返回String类型的请求结果数据或者不清楚返回什么类型时可以用StringRequest对象。
下面使用Get请求方式返回一个String类型的手机归属地信息。
MainActivity.java

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
volleyGet();
}
/**
* new StringRequest(int method,String url,Listener listener,ErrorListener errorListener)
* method:请求方式,Get请求为Method.GET,Post请求为Method.POST
* url:请求地址
* listener:请求成功后的回调
* errorListener:请求失败的回调
*/
private void volleyGet() {
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
StringRequest request = new StringRequest(Method.GET, url,
new Listener<String>() {
@Override
public void onResponse(String s) {//s为请求返回的字符串数据
Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
}
},
new ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
}
});
//设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
request.setTag("testGet");
//将请求加入全局队列中
MyApplication.getHttpQueues().add(request);
}
}

运行结果:

.使用Get方式请求数据返回JsonObjectRequest对象
由于我们知道这个请求返回的是Json格式的数据,所以我们可以直接使用JsonObjectRequest作为请求返回结果对象。
下面使用Get请求方式返回一个Json格式的IP地址信息,这里只是展示一下返回的数据信息,具体的Json解析方法大家可自行研究。

/**
* new JsonObjectRequest(int method,String url,JsonObject jsonObject,Listener listener,ErrorListener errorListener)
* method:请求方式,Get请求为Method.GET,Post请求为Method.POST
* url:请求地址
* JsonObject:Json格式的请求参数。如果使用的是Get请求方式,请求参数已经包含在url中,所以可以将此参数置为null
* listener:请求成功后的回调
* errorListener:请求失败的回调
*/
private void volleyGet() {
String url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255";
JsonObjectRequest request = new JsonObjectRequest(Method.GET, url, null,
new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {//jsonObject为请求返回的Json格式数据
Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
}
},
new ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
}
}); //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
request.setTag("testGet");
//将请求加入全局队列中
MyApplication.getHttpQueues().add(request);
}

运行结果:

返回JsonArrayRequest对象的方法与JsonObjectRequest比较类似,这里就不再演示,请大家自行实现。
.使用Post方式请求数据返回StringRequest对象
使用Post方式需要手动传递请求参数,可以重写Request类的getParams()方法将请求参数名和参数值放入Map中进行传递。
MainActivity.java

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
volleyPost();
}
/**
* 使用Post方式返回String类型的请求结果数据
*
* new StringRequest(int method,String url,Listener listener,ErrorListener errorListener)
* method:请求方式,Get请求为Method.GET,Post请求为Method.POST
* url:请求地址
* listener:请求成功后的回调
* errorListener:请求失败的回调
*/
private void volleyPost() {
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
StringRequest request = new StringRequest(Method.POST, url,
new Listener<String>() {
@Override
public void onResponse(String s) {//s为请求返回的字符串数据
Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
}
},
new ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map = new HashMap<>();
//将请求参数名与参数值放入map中
map.put("tel","15850781443");
return map;
}
}
;
//设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
request.setTag("testPost");
//将请求加入全局队列中
MyApplication.getHttpQueues().add(request);
}
}

.使用Post方式请求数据返回JsonObject对象

/**
* 使用Post方式返回JsonObject类型的请求结果数据
*
* new JsonObjectRequest(int method,String url,JsonObject jsonObject,Listener listener,ErrorListener errorListener)
* method:请求方式,Get请求为Method.GET,Post请求为Method.POST
* url:请求地址
* JsonObject:Json格式的请求参数。如果使用的是Get请求方式,请求参数已经包含在url中,所以可以将此参数置为null
* listener:请求成功后的回调
* errorListener:请求失败的回调
*/
private void volleyPost() {
String url = "http://www.kuaidi100.com/query";
Map<String,String> map = new HashMap<>();
map.put("type","yuantong");
map.put("postid","229728279823");
//将map转化为JSONObject对象
JSONObject jsonObject = new JSONObject(map); JsonObjectRequest request = new JsonObjectRequest(Method.POST, url, jsonObject,
new Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {//jsonObject为请求返回的Json格式数据
Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show();
}
},
new ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
}
});
//设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
request.setTag("testPost");
//将请求加入全局队列中
MyApplication.getHttpQueues().add(request);
}

.与Activity生命周期联动
可以在Activity关闭时取消请求队列中的请求。
@Override
protected void onStop() {
super.onStop();
//通过Tag标签取消请求队列中对应的全部请求
MyApplication.getHttpQueues().cancelAll("abcGet");
}
.使用ImageRequest加载网络图片
MainActivity.java

public class MainActivity extends AppCompatActivity {
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image);
loadImageByVolley();
}
/**
* 通过Volley加载网络图片
*
* new ImageRequest(String url,Listener listener,int maxWidth,int maxHeight,Config decodeConfig,ErrorListener errorListener)
* url:请求地址
* listener:请求成功后的回调
* maxWidth、maxHeight:设置图片的最大宽高,如果均设为0则表示按原尺寸显示
* decodeConfig:图片像素的储存方式。Config.RGB_565表示每个像素占2个字节,Config.ARGB_8888表示每个像素占4个字节等。
* errorListener:请求失败的回调
*/
private void loadImageByVolley() {
String url = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
ImageRequest request = new ImageRequest(
url,
new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
image.setImageBitmap(bitmap);
}
},
0, 0, Config.RGB_565,
new ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
image.setImageResource(R.mipmap.ic_launcher);
}
});
//设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
request.setTag("loadImage");
//通过Tag标签取消请求队列中对应的全部请求
MyApplication.getHttpQueues().add(request);
}
}

运行结果:

.使用ImageLoader加载及缓存网络图片
MainActivity.java

public class MainActivity extends AppCompatActivity {
private ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image);
loadImageWithCache();
}
/**
* 通过ImageLoader加载及缓存网络图片
*
* new ImageLoader(RequestQueue queue,ImageCache imageCache)
* queue:请求队列
* imageCache:一个用于图片缓存的接口,一般需要传入它的实现类
*
* getImageListener(ImageView view, int defaultImageResId, int errorImageResId)
* view:ImageView对象
* defaultImageResId:默认的图片的资源Id
* errorImageResId:网络图片加载失败时显示的图片的资源Id
*/
private void loadImageWithCache() {
String url = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());
ImageListener listener = loader.getImageListener(image,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
//加载及缓存网络图片
loader.get(url,listener);
}
}

BitmapCache.java

public class BitmapCache implements ImageLoader.ImageCache{
//LruCache是基于内存的缓存类
private LruCache<String,Bitmap> lruCache;
//LruCache的最大缓存大小
private int max = 10 * 1024 * 1024;
public BitmapCache() {
lruCache = new LruCache<String, Bitmap>(max){
@Override
//缓存图片的大小
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return lruCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
lruCache.put(s,bitmap);
}
}

运行结果:

完整源码:点击下载
Android热门网络框架Volley详解的更多相关文章
- Android热门网络框架Volley详解[申明:来源于网络]
Android热门网络框架Volley详解[申明:来源于网络] 地址:http://www.cnblogs.com/caobotao/p/5071658.html
- Android组件化框架项目详解
简介 什么是组件化? 项目发展到一定阶段时,随着需求的增加以及频繁地变更,项目会越来越大,代码变得越来越臃肿,耦合会越来越多,开发效率也会降低,这个时候我们就需要对旧项目进行重构即模块的拆分,官方的说 ...
- Android okHttp网络请求库详解
okhttp 是一个 Java 的 HTTP+SPDY 客户端开发包,同时也支持 Android.需要Android 2.3以上. 特点 OKHttp是Android版Http客户端.非常高效,支持S ...
- Android 开发 MaterialDialog框架的详解
前言 开始之前还是需要废话一下,因为有一些坑需要告知.首先MaterialDialog在GitHub上作者已经转型使用100% Kotlin语言编写,虽然可以在Java里调用Kotlin使用.但是个人 ...
- 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(体验篇)和 ...
随机推荐
- Learning LexRank——Graph-based Centrality as Salience in Text Summarization(一)
(1)What is Sentence Centrality and Centroid-based Summarization ? Extractive summarization works by ...
- 转:使用Tengine替代Nginx作为负载均衡服务器
原文来自于:http://heylinux.com/archives/2938.html Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级 ...
- CSS3随笔系列之transform(一)—— transform-origin
transform-origin属性平时似乎用得很少,它决定了变换时依赖的原点.基本的属性特性可以参考CSS手册. 如果在H5动画项目中,用到旋转的话,它还是不能小觑的. 假如我们做一个秋千效果 其实 ...
- BZOJ4033 T1
Description 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0-N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色,并将其他的\(N-K\)个点染成白色.将 ...
- Reactor Cooling
sgu194:http://acm.sgu.ru/problem.php?contest=0&problem=194 题意:题目大意:给n个点,及m根pipe,每根pipe用来流躺液体的,单向 ...
- Android 隐式意图 让用户选择一个浏览器访问网址
Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse("h ...
- Junit4学习笔记
一.初始化标注 在老Junit4提供了setUp()和tearDown(),在每个测试函数调用之前/后都会调用. @Before: Method annotated with @Before exec ...
- C/C++ 开源库及示例代码
C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...
- uva 11731 - Ex-circles
题意:已知三角形ABC的3条边长,求三角形ABC 的面积,以及阴影部分的总面积. #include<iostream> #include<cstdio> #include< ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...