一、Volley简介和特点

1. 简介:

  • 并发、效率、性能 高要求
  • Volley(齐射,迸发)
  • Volley是Google2013发布的Android平台上的网络通信库

2. Volley特点:

  • 通信更快,更简单,更健壮
  • Get、Post网络请求及网络图像的高效率异步处理请求
  • 对网络请求进行排序优先级处理
  • 网络请求的缓存
  • 多级别取消请求(同时取消正在进行的多个网络请求)
  • 和Activity生命周期的联动(当Activity销毁的时候可以同时取消正在进行的网络请求操作,提高性能)

3. 缺点:

  • 不适合上传和下载操作

    如果有上传和下载需求可以考虑其他的框架

二、为什么使用Volley

1. 功能上:

  • 高效的Get/Post方式的数据请求交互
  • 网络图片的加载和缓存

2. 其他:

  • Volley是Google官方推出的针对Android的专用网络通讯库,优化的非常好,非常权威
  • 性能稳定,强劲

三、Volley框架功能介绍

1、Volley的get和post请求方式的使用

  • 是对Android原生Get和Post请求的简单二次封装和优化
  • 挑选合适的返回对象:(确定的类型效率更好)
    • StringRequest
    • JsonObjectRequest
    • JsonArrayRequest
  • 回调的使用:
    • 请求成功
    • 请求失败
    • 请求重试

2、Volley的网络请求队列建立和取消队列请求

  • 使用Volley的时候首先要建立一个全局的请求队列,将建立的每一个网络请求加入到全局队列里面
  • 整个APP的请求都是通过整个队列来管理的,这样方便取消某个请求或取消所有请求

3、Volley与Activity生命周期的联动

  • 网络请求的生命周期和Activity的生命周期是关联到一起的
  • 可以在Activity销毁的时候,同时关闭请求,防止在Activity销毁的时候在后台继续执行请求,导致内存溢出或用户体验不好
  • 关键点: 设置Tag标签,onStop()里执行取消请求

4、Volley的简单的二次回调封装

  • 假如我们要在请求开始的时候弹出一个对话框,请求结束的时候隐藏对话框,尽兴一些数据的处理,就需要创建一个全局的二次回调封装,这样,我们在项目开发中就可以根据不同的需求进行定制,而且管理起来也非常的方便和灵活

四、Get请求

  • gradle配置:compile 'com.mcxiaoke.volley:library:1.0.19'
  • 重写Application建立请求队列
public class MyApplication extends Application {

    public static RequestQueue queues;//建立请求队列

    @Override
public void onCreate() {
super.onCreate();
queues = Volley.newRequestQueue(getApplicationContext());
} public static RequestQueue getHttpQueues(){
return queues;
}
}
  • Get请求:
private void volley_get() {
String url = "http://192.168.1.120:8080/aa.json";
StringRequest request = new StringRequest(Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//成功的回调
System.out.println("成功返回:"+response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//失败的回调
System.out.println("失败返回:"+error.getMessage());
}
}); request.setTag("abcGet");//设置标签,通过标签在队列中寻找,所以名字尽量有意义
MyApplication.getHttpQueues().add(request);//加入到全局队列
}
  • JsonObjectRequest
private void volley_get_jsonObject(){
String url = "http://192.168.1.120:8080/aa.json";
// JsonObjectRequest request1 = new JsonObjectRequest(Method.GET, url, null,
// new Response.Listener<JSONObject>() {
// @Override
// public void onResponse(JSONObject response) {
// Toast.makeText(getParent(),response.toString(),1).show();
// }
// }, new Response.ErrorListener() {
// @Override
// public void onErrorResponse(VolleyError error) {
//
// }
// }); // request1.setTag("abcGet");//设置标签,通过标签在队列中寻找,所以名字尽量有意义
// MyApplication.getHttpQueues().add(request1);//加入到全局队列
}

五、Post请求:

  • post
private void volley_post(){
String url = "http://192.168.1.120:8080/aa.json";
StringRequest request = new StringRequest(Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) { }
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) { }
}){
//Post请求参数需要重写这个方法
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> hashMap = new HashMap<>();
hashMap.put("name","zhangsan");
hashMap.put("password","123456");
return super.getParams();
}
};
request.setTag("abcPost");
MyApplication.getHttpQueues().add(request);
}
  • JsonObjectRequest
private void volley_post_jsonObject(){
String url = "http://192.168.1.120:8080/aa.json";
HashMap<String,String> map = new HashMap<>();
map.put("name","zhangsan");
map.put("password","123456");
JSONObject postParams = new JSONObject(map);
JsonObjectRequest request = new JsonObjectRequest(Method.POST, url, postParams, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) { }
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) { }
});
request.setTag("abcPost");
MyApplication.getHttpQueues().add(request);
}

六、Volley与Activity联动

@Override
protected void onStop() {
super.onStop();
MyApplication.getHttpQueues().cancelAll("abcGet");
}

七、Volley的简单二次回调封装

/**
* Created at: 2016/5/17 18:33.
* by author: mwp
* 描述:自定义回调
*/
public abstract class VolleyInterface {
public Context mContext;
public static Response.Listener<String> mListener;
public static Response.ErrorListener mErrorListener; public VolleyInterface(Context context, Response.Listener<String> listener, Response.ErrorListener errorListener) {
mContext = context;
mListener = listener;
mErrorListener = errorListener;
} public abstract void onSuccess(String result);//成功的回调
public abstract void onError(VolleyError error);//失败的回调 public Response.Listener<String> successListener(){
mListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//弹出加载中
onSuccess(response);
}
};
return mListener;
} public Response.ErrorListener errorListener(){
mErrorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//提示请求失败
onError(error);
}
};
return mErrorListener;
}
}

/**
* Created at: 2016/5/17 18:27.
* by author: mwp
* 描述:封装请求
*/
public class VolleyRequest { public static StringRequest stringRequest;
public static Context sContext; public static void RequestGet(Context context,String url, String tag, VolleyInterface vif){
sContext = context;
MyApplication.getHttpQueues().cancelAll(tag);//如果之前存在,先取消,避免重复的请求 stringRequest = new StringRequest(Request.Method.GET,url,vif.successListener(),vif.errorListener());
stringRequest.setTag(tag);
MyApplication.getHttpQueues().add(stringRequest);
MyApplication.getHttpQueues().start();
} public static void RequestPost(Context context,String url,String tag, final Map<String,String> params,VolleyInterface vif){
MyApplication.getHttpQueues().cancelAll(tag);
stringRequest = new StringRequest(url,vif.successListener(),vif.errorListener()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
stringRequest.setTag(tag);
MyApplication.getHttpQueues().add(stringRequest);
MyApplication.getHttpQueues().start();
}
}
//请求调用
private void my_volley_get(){
String url = "";
VolleyRequest.RequestGet(this, url, "tag", new VolleyInterface(this,VolleyInterface.mListener,VolleyInterface.mErrorListener) {
@Override
public void onSuccess(String result) { } @Override
public void onError(VolleyError error) { }
});
}

八、Volley加载图片的介绍及使用

1. 缓存功能的简单介绍

  • LruCache

  • ImageCache

2. 加载网络图片及监听

  • ImageRequest
private void loadImage1() {
String url = "http://g.hiphotos.baidu.com/imgad/pic/item/a8773912b31bb051be533b24317adab44aede043.jpg";
//String url = "http://192.168.1.120:8080/wq.jpg";
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//成功的回调
mIv_iamge.setImageBitmap(response); }
}, 0, //宽度,0的话显示原始尺寸,具体值得话按比例压缩//
0, //高度
Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//图片加载失败的回调
System.out.println("加载失败"+error.toString());
}
});
imageRequest.setTag("image");
MyApplication.getHttpQueues().add(imageRequest);
}
  • ImageLoder
private void loadImage2() {
String url = "http://g.hiphotos.baidu.com/imgad/pic/item/a8773912b31bb051be533b24317adab44aede043.jpg";
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(mIv_iamge,R.drawable.ic_launcher,R.drawable.ic_launcher);
loader.get(url,listener);
}
public class BitmapCache implements ImageLoader.ImageCache {

    public LruCache<String, Bitmap> cache;
public int max = 10*1024*1024; public BitmapCache(){
cache = new LruCache<String,Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
} @Override
public Bitmap getBitmap(String url) {
return cache.get(url);
} @Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url,bitmap);
}
}
  • NetworkImageView
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/iv_network"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
private void imageLoad3() {
String url = "http://g.hiphotos.baidu.com/imgad/pic/item/a8773912b31bb051be533b24317adab44aede043.jpg"; ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());
//NetworkImageView
mIv_network.setDefaultImageResId(R.drawable.ic_launcher);
mIv_network.setErrorImageResId(R.drawable.ic_launcher);
mIv_network.setImageUrl(url,loader);
}

Android-Volley详解的更多相关文章

  1. Android热门网络框架Volley详解[申明:来源于网络]

    Android热门网络框架Volley详解[申明:来源于网络] 地址:http://www.cnblogs.com/caobotao/p/5071658.html

  2. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  3. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  4. Android ActionBar详解

    Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar   目录(?)[+]   第4 ...

  5. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  6. Android编译系统详解(一)

    ++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ...

  7. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  8. 【整理修订】Android.mk详解

    Android.mk详解 1. Android.mk 的应用范围 Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 一个Android.mk文件可以编 ...

  9. Android菜单详解(四)——使用上下文菜单ContextMenu

    之前在<Android菜单详解(二)——创建并响应选项菜单>和<Android菜单详解(三)——SubMenu和IconMenu>中详细讲解了选项菜单,子菜单和图标菜单.今天接 ...

  10. Android签名详解(debug和release)

    Android签名详解(debug和release)   1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ...

随机推荐

  1. CSS中animate属性

    我记得,在工作中直接使用animation,只要能做出动画就完了,根本没有看每一个细节. 其实,这样做对于我们来说,的确没有错,因为工作中没有时间给你看每一个细节,大致看一篇就没下文了. 当我们想要好 ...

  2. Scrum角色

    产品负责人(Product Owner)的职责如下: 确定产品的功能. 决定发布的日期和发布内容. 为产品的profitability       of the product (ROI)负责. 根据 ...

  3. Typecho集成ueditor笔记

    前言:萝卜青菜各有所爱,因为个人需求所以需要在博客中集成ueditor,并非是我不喜欢md语法 其实本篇的笔记的书写最早也是在本地的md编辑器上完成的 1. 首先下载ueditor编辑器,然后重命名文 ...

  4. IE浏览器 json异常

    当使用json数据结构时,如果对象数组最后一个元素后面依然跟一个“,”,在非IE浏览器下运行正常,但是,在IE浏览器上,则会报错. 如果使用for循环遍历对象数组时,由于后面多了一个分割符" ...

  5. algorithm@ Sieve of Eratosthenes (素数筛选算法) & Related Problem (Return two prime numbers )

    Sieve of Eratosthenes (素数筛选算法) Given a number n, print all primes smaller than or equal to n. It is ...

  6. Ruiy自我识人做事领悟录ing

    是坑总需要人去踩,谁踩谁收获! 做人做事分层分次,后方能至始及终不乱; 做人做事切记诚记信,宁他人负我,我定不负他人! 做人做事做力求清心寡欲; 安静做工,沉静学道;

  7. LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt

    十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...

  8. 使用google map v3 api 开发地图服务

    Google Map V3 API 学习地址: http://code.google.com/intl/zh-CN/apis/maps/documentation/javascript/article ...

  9. Failed to load libGL.so in android

    使用命令:find / -name libGL.so 得到: /usr/lib/i386-linux-gnu/libGL.so /usr/lib/i386-linux-gnu/mesa/libGL.s ...

  10. AutoCAD DxfCode组码值类型

    0-9 字符串(随着从 AutoCAD 2000 起引入了扩展符号名称,字数限制已由 255 个字符扩大到 2049 个单字节字符,不包括行末的换行符) 10-39 双精度三维点值 40-59 双精度 ...