网络----Volley

转载 2018年04月17日 21:38:28

手撕 Volley (一)

 

来自 <https://www.jianshu.com/p/33be82da8f25>

 

 

Android Volley完全解析(一),初识Volley的基本用法

 

来自 <https://blog.csdn.net/guolin_blog/article/details/17482095>

 

 

 

数据量不大,但网络通信频繁的,因此非常适合使用Volley。

  • JSON,图像等的异步下载;
  • 网络请求的排序(scheduling)
  • 网络请求的优先级处理
  • 缓存
  • 多级别取消请求
  • 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

 

 

一、使用Volley发出请求步骤:

1.、创建RequestQueue对象

RequestQueue mQueue =Volley.newRequestQueue(context); 

RequestQueue是一个请求队列对象,

缓存所有的HTTP请求,

RequestQueue内部按照一定的算法并发地发出这些请求,非常合适高并发的,

在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。

 

2、创建请求对象StringRequest

StringRequeststringRequest = new StringRequest(Method.POST, url,  listener, errorListener); 

StringRequeststringRequest = new StringRequest(url, listener, errorListener); 

第一个参数就是目标服务器的URL地址,

第二个参数是服务器响应成功的回调,

第三个参数是服务器响应失败的回调。

 

StringRequest stringRequest = new StringRequest(

"http://www.baidu.com",  

                        new Response.Listener<String>() {  

                            @Override  

                            public void onResponse(String response) {  

                                Log.d("TAG", response);  

                            }  

                        }, new Response.ErrorListener() {  

                            @Override  

                            public void onErrorResponse(VolleyError error) {  

                                Log.e("TAG", error.getMessage(), error);  

                            }  

 });  

3、将请求加入队列:

mQueue.add(stringRequest); 

 

4、使用StringRequest发出Post请求

1.构造函数中传入Method.POST

2.重写"getParams"方法设置post参数

 

StringRequest中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:

 

  1. StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {  
  2.     @Override  
  3.     protected Map<String, String> getParams() throws AuthFailureError {  //Volley判断Post方法会调用
  4.         Map<String, String> map = new HashMap<String, String>();  
  5.         map.put("params1""value1");  
  6.         map.put("params2""value2");  
  7.         return map;  
  8.     }  
  9. };  

 

二、JsonRequest的用法

JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest

  1.  Map<String, String> map = new HashMap<String, String>();  
  2.         map.put("user""jt1024");  
  3.         map.put("psw""111111");  
  4.         JSONObject object = new JSONObject(map);  

 

  1.   JsonObjectRequest request = new JsonObjectRequest(Method.POST, urlpost, objectnew Listener<JSONObject>() {  
  2.             @Override  
  3.             public void onResponse(JSONObject response) {  
  4.                 tv_resp1.setText(response.toString());  
  5.             }  
  6.         }, new Response.ErrorListener() {  
  7.             @Override  
  8.             public void onErrorResponse(VolleyError error) {  
  9.                 tv_resp1.setText(error.toString());  
  10.             }  
  11.         });  
  12.         request.setTag("volley_JsonObjectRequestPost");  
  13.         MyApplication.getInstance().addToRequestQueue(request);   

 

 

 

三、图片请求

ImageRequest

  1.  * 第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩, 
  2.  * 指定成0的话就表示不管图片有多大,都不会进行压缩。 
  3.  *  
  4.  * @param url 
  5.  *            图片地址 
  6.  * @param listener 
  7.  * @param maxWidth 
  8.  *            指定允许图片最大的宽度 
  9.  * @param maxHeight 
  10.  *            指定允许图片最大的高度  ,如果实际图片比这个大,则自动进行图片压缩
  11.  * @param decodeConfig 
  12.  *            指定图片的颜色属性,Bitmap.Config下的几个常量. 
  13.  * @param errorListener 

 

  1.  ImageRequest imReq = new ImageRequest(url, new Listener<Bitmap>() {  
  2.   
  3.         @Override  
  4.         public void onResponse(Bitmap arg0) {  
  5.             iv.setImageBitmap(arg0);  
  6.         }  
  7. }, 6060, Bitmap.Config.ARGB_8888, new StrErrListener());  
  8. requestQueue.add(imReq);  

 

ImageLoader使用

内部也是使用ImageRequest来实现的,不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求

  1.  // getImageListenerimageView控件对象,默认图片地址,失败图片地址);  
  2. ImageListener listener = ImageLoader.getImageListener(

imageView, 

android.R.drawable.ic_menu_rotate, 

android.R.drawable.ic_delete);  

  1.  
  2. // get(图片地址,listener,宽,高);自动帮你处理图片的宽高再也不怕大图片的oom  (创建ImageLoader时候带上ImageCach!!!避免OOM)
  3. ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache {  
  4.     private LruCache<String, Bitmap> mCache;  
  5.     public BitmapCache() {  
  6.         final int maxSize = (int) (Runtime.getRuntime().maxMemory() / 1024) / 8
  7.         mCache = new LruCache<String, Bitmap>(maxSize) {  
  8.             @Override  
  9.             protected int sizeOf(String key, Bitmap bitmap) {  
  10.                 return bitmap.getRowBytes() * bitmap.getHeight();  
  11.             }  
  12.         };  
  13.     }  
  14.   
  15.     @Override  
  16.     public Bitmap getBitmap(String url) {  
  17.         return mCache.get(url);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void putBitmap(String url, Bitmap bitmap) {  
  22.         mCache.put(url, bitmap);  
  23.     }  
  24. );  

 

mImageLoader.get(url, listener,100,200);  

 

★使用LruCache进行图片缓存

  1. BitmapCache  extends LruCache<String, Bitmap> implements ImageCache { 
  2.     // LruCache 原理:Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。 cache已满的时候加入新的item时,在队列尾部的item会被回收。  
  3.     // 解释:当超出指定内存值则移除最近最少用的图片内存  
  4.     public static int getDefaultLruCacheSize() {  
  5.         // 拿到最大内存  
  6.         final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  
  7.         // 拿到内存的八分之一来做图片内存缓存  
  8.         final int cacheSize = maxMemory / 8;  
  9.   
  10.         return cacheSize;  
  11.     }  
  12.   

 

 

 

四、图片加载控件NetworkImageView

Volley还提供的加载图片的控件com.android.volley.NetworkImageView。

1.控件在被从父控件detach的时候,会自动取消网络请求的,

2.NetworkImageView还会根据你对图片设置的width和heigh自动压缩该图片不会产生多的内存

3.还有NetworkImageView在列表中使用不会图片错误

 

  1. private void networkImageViewUse(NetworkImageView iv, String url) {  
  1.         ImageLoader imLoader = new ImageLoader(mQueue, new BitmapLruCache());  
  2.         iv.setDefaultImageResId(R.drawable.ic_launcher);  
  3.         iv.setErrorImageResId(R.drawable.ic_launcher);  
  4.         iv.setImageUrl(url, imLoader);  
  5.     }  

 

五、如何取消请求

  1. activity自动销毁时它会自定取消所有请求。
  2. 给请求设置标签:

request.setTag("My Tag");    

取消所有指定标记的请求:

request.cancelAll("My Tag");    

 

 

六、Volley请求流程

 

其中蓝色部分代表主线程,绿色部分代表缓存线程橙色部分代表网络线程。

1.主线程中调用RequestQueue的add()方法来添加一条网络请求

2.请求会先被加入到缓存队列当中

3.如果发现可以找到相应的缓存结果就直接读取缓存并解析,然后回调给主线程。

4.如果在缓存中没有找到结果,则将这条请求加入到网络请求队列中,然后处理发送HTTP请求,解析响应结果,写入缓存,并回调主线程。

volley之缓存、网络与重试

基础         volley对所有的请求都有本地缓存,对同一请求一般先从缓存中获取,获取不到再从网络获取。通常对图片进行三级缓存也是同样的思路。 CacheDispatcher         ...
  • u010410408
  • u010410408
  • 2016年08月15日 18:27
  • 469

使用volley进行网络请求

//Volley 缓存StringRequest,JsonObjectRequest两级缓存(网络--->磁盘) //ImageLoader(三级缓存 网络--->内存缓存---->磁盘) //从缓存...
  • HotSmoking
  • HotSmoking
  • 2017年04月27日 19:25
  • 259

网络连接之——谷歌提供的通信框架Volley【避免创建多个线程对象】

参考:http://www.kwstu.com/ArticleView/kwstu_201441183134291.概述:如今,android应用不可避免会用到网络技术,而常用的就是HttpURLCo...
  • womengmengyan
  • womengmengyan
  • 2015年09月14日 10:06
  • 1250

Android之Volley框架加载网络图片的三种方式

1.第一种也是最常用的一种:ImageLoader public void imageLoader(String url,ImageView iv){ //ImageLoader的第一...
  • ygd1994
  • ygd1994
  • 2016年05月08日 23:18
  • 1344

Android面试题-Volley源码分析

Volley源码分析
  • mwq384807683
  • mwq384807683
  • 2017年05月07日 00:02
  • 1095

Android网络框架Volley的使用总结

其实Volley网络框架实现了二级缓存机制(内存和网络),比如页面的信息刚使用Volley网络框架来请求数据,那么它的数据可以保存在缓存中,页面跳转到其他页面后,再跳转到原来缓存过的页面,那么这时是不...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年11月18日 13:20
  • 835

Volley超时重试机制详解

Volley超时重试机制基础用法Volley为开发者提供了可配置的超时重试机制,我们在使用时只需要为我们的Request设置自定义的RetryPolicy即可. 参考设置代码如下:int DEFAU...
  • zinss26914
  • zinss26914
  • 2016年12月03日 17:01
  • 6400

volley源码解析(五)--NetworkDispatcher从网络中获取数据

上一篇文章当中,我介绍了CacheDispatcher和缓存类Cache是怎么根据request从缓存中获取到数据的,接下来这篇文章,将会介绍网络数据的获取。 对比缓存的获取,其实我们也有两个类,一个...
  • kangaroo835127729
  • kangaroo835127729
  • 2015年06月15日 21:02
  • 2120

Volley二次封装,实现网络请求缓存

Android目前很多同学使用Volley请求网络数据,但是Volley没有对请求过得数据进行缓存,因此需要我们自己手动缓存。 一下就是我的一种思路,仅供参考 NetWorkHelper---对...
  • zxm317122667
  • zxm317122667
  • 2015年11月04日 11:13
  • 4865

Android——使用Volley+fastJson在新线程中读取网络接口获取天气信息

一,关于Volley           其实最初对于网络数据的访问,我是没想到要用框架的,使用HttpURLConnection或者HttpGet or HttpPost都可以实现。但是why? w...
  • lhc2207221755
  • lhc2207221755
  • 2015年10月06日 15:58
  • 3058
收藏助手
不良信息举报
您举报文章:网络----Volley
举报原因:
原因补充:

(最多只允许输入30个字)