🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
***** **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);     } } ~~~