*****
**Volley网络框架**
[TOC=6]
1、Volley 是什么?
2、Volley 如何接入,源代码怎么获取 ?
一、Volley是什么?
Volley是HTTP库,使得Android应用的网络操作更容易,尤其重要的是,相比较于普通Android 网络Api速度更快、也更优雅。
二、Volley具有如下优点:
网络请求的自动调度:拥有调度线程池
多个并发的网络连接:拥有请求缓存池
缓存设计遵循 Cache Coherence
支持请求优先级管理。
取消请求API。取消单个请求,也支持按照Tag来配置请求取消的区域或范围。
面向接口编程:框架灵活、易于定制,例如,重试机制
强序关系使得很容易的通过异步方式从网络正确的得到数据,填充到UI界面上。
调试和跟踪工具:VolleyLog、VolleyLog#VolleyLog等
.使用Volley
1.Volley的网络请求队列建立与取消队列请求
使用Volley需要建立一个全局的请求队列,这样我们就可以将一个请求加入到这个全局队列中,并可以管理整个APP的所有请求,包括取消一个或所有的请求。
2.Volley的Get和Post请求方式的使用
Volley的Get和Post请求方式其实是对Android原生Get和Post请求方式进行了二次封装,对效率等进行优化。在使用Get和Post请求方式之前,我们要确定所请求的数据返回什么对象,Volley自带了三种返回类型:
StringRequest:主要使用在对请求数据的返回类型不确定的情况下;
ImageRequest:主要使用在请求图片;
JsonRequest:主要请求JSON数据;
* JsonObjectRequest:请求Json对象
* JsonArrayRequest:请求Json数组
3.Volley与Activity生命周期的联动
简单来说就是Volley中的请求是与Activity的生命周期进行关联。这样可以在Android销毁时关闭Volley的请求,防止请求在后台运行造成内存溢出等情况发生。与Activity生命周期进行联动时需要设置Tag标签,因为取消请求需要在请求队列中通过Tag标签进行查找,在Activity的onStop中执行取消请求的操作。
下面通过代码进行实例的演示。
使用
第一步添加网络权限
添加依赖
~~~
implementation 'com.mcxiaoke.volley:library:1.0.19'
~~~
第二步 初始化volley
~~~
第一种在Application中写RequestQueue对象。
存在的问题,请求队列在Application类中,请求对象封装在工具类中,代码分别在两部分中。
MyApplication.java
publicclass MyApplication extends Application{
privatestatic RequestQueue queues ;
@Override
publicvoid onCreate() {
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueues() {
return queues;
}
}
~~~
~~~
第二种:都放在工具类中
public class VolleyHttpImpl implements HttpUtil {
private static VolleyHttpImpl instance = null;
private RequestQueue queue;
/**
* 构造方法
* @param context
*/
private VolleyHttpImpl(Context context) {
if (context == null) {
throw new IllegalArgumentException("初始化的时候,content不能是null");
}
queue = Volley.newRequestQueue(context);
}
/**
* 创建VolleyHttpImpl对象
* @param context
* @return
*/
public static VolleyHttpImpl create(Context context) {
if (instance == null) {
synchronized (VolleyHttpImpl.class) {
instance = new VolleyHttpImpl(context);
}
}
return instance;
}
/**
* 获取VolleyHttpImpl对象
* @return
*/
public static VolleyHttpImpl getInstance() {
return create(null);
}
/**
* 根据tag关闭请求
*/
public void cancelAll(String tag) {
queue.cancelAll(tag);
}
}
~~~
第三步通过请求方式写网络请求方法
Get方式请求数据返回StringRequest对象
~~~
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对象
~~~
/**
* 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);
~~~
Post方式请求数据返回StringRequest对象
~~~
/**
* 使用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生命周期联动
~~~
@Override
protected void onStop() {
super.onStop();
//通过Tag标签取消请求队列中对应的全部请求
MyApplication.getHttpQueues().cancelAll("abcGet");
}
~~~
使用ImageRequest加载网络图片
~~~
/**
* 通过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加载及缓存网络图片
~~~
/**
* 通过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 设置图片缓存
~~~
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);
}
}
~~~
- 班规
- 第一单元 Git
- 1.1 Git简介
- 1.2 Git安装
- 1.3 版本控制
- 1.4 远程仓库
- 1.5 分支管理
- 1.6 Git命令总结
- 1.7 在Android Studio中使用Git
- 第一单元 作业
- 第二单元 项目立项
- 2.1 需求文档
- 2.2 原型图
- 2.3 接口文档
- 2.4 项目实现
- 2.5 制定开发计划
- 第二单元 作业
- 第三单元 MVP搭建项目框架
- 3.1 代码架构模式
- 3.2 普通方式写代码
- 3.3 使用MVC重构代码
- 3.4 使用MVP重构代码
- 3.5 使用接口提高代码通用性
- 3.6 内存泄漏
- 3.7 使用契约统一管理接口
- 第三单元 作业
- 第四单元 MVP架构优化
- 4.1 MVP基类封装与泛型应用
- 4.3 BaseActivity的封装
- 第五单元 Volley网络框架
- 5.1 Volley网络框架
- 第六单元 Glide实现图片异步加载
- 6.1 开始使用
- 6.2 占位符
- 6.3 Glide缓存
- 6.4 GlideGifVideo与色彩模式
- 第七单元 传统屏幕适配
- 7.1 相对布局
- 7.1 权重
- 7.3 .9Patch
- 7.4 dimens适配
- 7.5 国际化
- 7.6 shape实现自定义样式
- 7.7 自定义样式
- 7.8 沉浸式状态栏
- 第八单元 RecyclerView
- 8.1 RecycleView
- 第九单元 自定义View
- 第十单元 自定义View实战
- 第十一单元 自定义View进阶
- 第二十单元 属性动画
- 第十三单元 异常捕获机制
- 第十四单元 原生登录、注册模块
- 第十五单元 第三方登录、分享、统计
- 第十六单元 HTML5新特性
- 第十七单元 CSS3新特性
- 第十八单元 WebView与JS交互
- 第一周周考
- 第二周周考
- 第三周周考
- 月考