• Android-Volley详解


    一、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);
    }
    
  • 相关阅读:
    P3387 【模板】缩点 tarjan
    P2831 愤怒的小鸟 状压dp
    交流帖
    P3959 宝藏 模拟退火。。。
    B1060 [ZJOI2007]时态同步 dfs
    P1850 换教室 概率dp
    树链刨分(待修改)
    B3403 [Usaco2009 Open]Cow Line 直线上的牛 deque
    B3402 [Usaco2009 Open]Hide and Seek 捉迷藏 最短路
    B5248 [2018多省省队联测]一双木棋 状压dp
  • 原文地址:https://www.cnblogs.com/rocomp/p/5504475.html
Copyright © 2020-2023  润新知