一、Volley特点

通信更快,更简单(数据量不大,但网络通信频繁)

Get、Post网络请求及网络图像的高效率异步处理

排序(可以通过网络请求的优先级进行处理)

网络请求的缓存

多级别取消请求

和Activity生命周期的联动

二、为什么使用Volley

高效的Get/Post方式的数据请求交互

网络图片加载和缓存

三、Volley框架的使用

1.Volley的GET、Post

首先我们需要知道Volley自带了三种返回类型:

StringRequest:主要使用在对请求数据的返回类型不确定的情况下,StringRequest涵盖了JsonObjectRequest和JsonArrayRequest。

JsonObjectRequest:当确定请求数据的返回类型为JsonObject时使用。

JsonArrayRequest:当确定请求数据的返回类型为JsonArray时使用。

首先我们需要建立一个全局的请求队列,这样我们可以将一个请求加入到这个全局队列中,并可以管理整个APP的所有请求,包括取消一个或所有的请求。

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;
}
}

注意,我们需要在AndroidManifest中注册这个Application,记得加上网络权限

使用Get方法来请求数据

返回数据为StringRequest

 private void volley_Get(){
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=......";
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
}); request.setTag("abcGet");
MyApplication.getHttpQueues().add(request); }

这里面需要注意的便是构造StringRequest实例时传入的参数

第一个参数:请求数据的方法(Method.GET...)

第二个参数:请求数据的路径

第三个参数:请求成功时的回调方法(可以在里面处理数据)     

第四个参数:请求失败时的回调方法

这下面还有一个方法

request.setTag();我们通过这个方法来为request设置标识,便于以后进行删除,查找请求的操作。

返回数据为JsonObjectRequest时

 private void volley_Get(){
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=...
";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
}
});
request.setTag("abcGet");
MyApplication.getHttpQueues().add(request); }

使用方法同上,但要注意的是,与之不同的是多了第三个参数,这里是用来放,传参时Json格式数据的,如果用的是GET方法,传入参数在url中,可以将其设置为null。

使用Post请求数据

返回数据为StringRequest

 public void vollye_Post(){
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this, volleyError.toString(), Toast.LENGTH_SHORT).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> hashMap = new HashMap<>();
hashMap.put("tel", "......
");
return hashMap;
}
};
request.setTag("abcPost");
MyApplication.getHttpQueues().add(request);
}

Post请求的方法使用与Get方法相似,但它多了一个方法

getParams()这个方法用Map来获取你所需要Post的数据

返回数据为Json格式数据时

即将你所要传入的数据放到参数中即可,不用使用getParams()方法

private void volleyPost() {
String url = "http://www.kuaidi100.com/query";
Map<String,String> map = new HashMap<>();
map.put("type","yuantong");
map.put("postid",".....");
//将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);
}

2.与Avctivity生命周期联动

其实就是在Activity退出时候或销毁时候,取消对应的网络请求,避免网络请求在后台浪费资源,所以,我们一般在onStop()方法中通过之前设置的Tag取消网络请求:

@Override
protected void onStop() {
super.onStop();
//通过Tag标签取消请求队列中对应的全部请求
MyApplication.getHttpQueues().cancelAll(tag);
}

3.Volley的二次封装

public abstract class VolleyInterface {
public Context mContext;
public static Response.Listener mListener;
public static Response.ErrorListener mErrorListener;
public VolleyInterface(Context context, Response.Listener 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 successListener(){
mListener = new Response.Listener() {
@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;
}
}
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();
//建议不要手动调用 RequestQueue 的 start() 方法,引起的问题“经常会报com.android.volley.NoConnectionError: java.io.InterruptedIOException”,然后就内容加载失败。。。 因为在 Volley.newRequestQueue() 方法中,已经调用了 start() 方法。
}
}

使用自己的封装方法

 private void volley_Get(){
String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
VolleyRequest.RequestGet(MainActivity.this, url, "abcGet", new VolleyAbstact(MainActivity.this,VolleyAbstact.mlistener,VolleyAbstact.mErrorListenerl) {
@Override
public void onMySuccess(String result) {
Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
} @Override
public void onMyError(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
}
}); }

4.获取网络图片

加载图片缓存

LruCache:这个类非常适合用来缓存图片,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除。

ImageCache:Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理LruCache内存缓存,因为一般在处理图片的问题上才更多的用到LruCache缓存,但是它提供了一个ImageCache接口供我们自己实现,该接口默认需要实现两个方法:getBitmap(String key)和putBitmap(String key, Bitmap bitmap)

加载图片与监听    ImageRequest:

ImageLoader:

NetworkImageView:

1.使用ImageRequest加载网络图片

ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
imageView.setBackgroundResource(Color.BLACK);
}
});
MyApplication.getHttpQueues().add(request);

第一个参数:请求数据的路径

第二个参数:数据请求成功后的回调

第三、四个参数:允许的最大宽度、高度(0,0时指的是原图传入)

第五个参数:指定图片的格式

第六个参数:数据请求失败后的回调

2.使用ImageLoader加载图片

ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

首先你需要建立一个缓存类

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 s) {
return cache.get(s);
} @Override
public void putBitmap(String s, Bitmap bitmap) {
cache.put(s,bitmap);
}
}

然后在MainActivity中

ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,Color.BLACK,Color.BLACK);
loader.get(url,listener);

getImageView中

第一个参数:放置图片的控件

第二个参数:请求默认的图片

第三个参数:请求失败的图片

3.使用networkImageView辅助加载图片

实例化networkImageView后

  String url = "https://www.baidu.com/img/bdlogo.png";
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),new BitmapCache());
networkImageView.setDefaultImageResId(Color.BLACK);
networkImageView.setErrorImageResId(Color.BLUE);
networkImageView.setImageUrl(url,loader);

第一个方法:请求默认的图片

第二个方法:请求失败的图片

第三个方法:请求得到的图片

四、总结:

到目前为止,本文就结束了,这篇文章主要讲了对Volley的粗糙使用,并未涉及太过复杂的知识。

Android--Volley框架的使用的更多相关文章

  1. Android Volley框架的使用(1)

    在Android开发中,经常要通过HTTP请求访问网络.为了使通过HTTP请求访问网络的过程更加简单,2013年提出了新的HTTP通信框架--Volley.Volley使用起来非常简单,适用于网络访问 ...

  2. Android Volley 框架的使用(一)

    为什么要使用Volley框架 开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应 ...

  3. Android Volley框架的使用(三)

     此博文源码下载地址  https://github.com/Javen205/VolleyDemo.git Image Request 为了更方便的使用Volley中的图片请求,我们同样先在Voll ...

  4. Android Volley框架的使用(二)

     此博文源码下载地址  https://github.com/Javen205/VolleyDemo.git 使用请求队列RequestQueue Volley中的Request都需要添加到Reque ...

  5. Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)

    在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...

  6. 035 Android Volley框架进行网络请求

    1.volley入门介绍 开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通 ...

  7. Android Volley框架的几种post提交请求方式

    首先简单描述一下Google的Android开发团队在2013年推出的一个网络通信框架Volley.它的设计目标是进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如下载文件等,Vol ...

  8. Android Volley框架的使用(3)

    4. 加载图片 在实际应用中,经常需要从网络上下载并显示图片.Volley也提供了从网络下载图片的几种方法,这里主要介绍两种方法:ImageRequest和ImageLoader. (1) Image ...

  9. Android Volley框架的使用(2)

    3. 设置请求类型和参数 Volley默认的请求类型是GET,如果需要用POST,可以在构造函数中进行设置.设置参数可以通过重写getParams()方法来实现. private void postR ...

  10. Android Volley框架的使用(5)

    6. 设置超时时间 可以为请求设置超时时间.最大重试次数.重试时间增长因子等.其中new DefaultRetryPolicy()的第一个参数是超时时间,第二个参数是最大重试次数.第三个参数是重试时间 ...

随机推荐

  1. 深入浅出聊优化:从Draw Calls到GC

    前言: 刚开始写这篇文章的时候选了一个很土的题目...<Unity3D优化全解析>.因为这是一篇临时起意才写的文章,而且陈述的都是既有的事实,因而给自己“文(dou)学(bi)”加工留下的 ...

  2. 超炫的HTML5粒子效果进度条 VS 如何规范而优雅地code

    最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜!   // _this.ch){ _this.particles.splice(i, 1); } }; this.Particle.p ...

  3. Vue.js——60分钟webpack项目模板快速入门

    概述 browserify是一个 CommonJS风格的模块管理和打包工具,上一篇我们简单地介绍了Vue.js官方基于browserify构筑的一套开发模板.webpack提供了和browserify ...

  4. 到爱尔兰敲代码 / Come, Coding in Ireland

    这是我在都柏林的第四个月,该办的证也都办完了,该安定下来的也安定下来了,所以也简单介绍下到爱尔兰做IT的相关过程和政策. 如果有兴趣在英语环境工作的话,我也可以帮忙推荐或者找找. 去年15年1月正好开 ...

  5. ArtifactTransferException: Failure to transfer org.apache.openejb:javaee-api:jar:5.0-1

    最近在myeclipse上创建maven类型的web项目的时候,出现了一个错误. ArtifactTransferException: Failure to transfer org.apache.o ...

  6. Alcatraz 的安装和删除

    Xcode 所有的插件都安装在目录: ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ 你也可以手工切换到这个目录来删除插件 ...

  7. CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  8. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录

    系列目录 我们之前做了验证码,登录界面,却没有登录实际的代码,我们这次先把用户登录先完成了,要不权限是讲不下去了 把我们之前的表更新到EF中去 登录在Account控制器,所以我们要添加Account ...

  10. 用原始方法解析复杂字符串,json一定要用JsonMapper么?

    经常采集数据,肯定会碰到解析字符串,包括整个页面的html,或者json以及一些不标准的json格式... 以前用json序列化,有时候需要实体类,有的时候没有,比较麻烦,听说可以用JsonMappe ...