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);
}
posted @ 2016-05-18 11:10  rocomp  阅读(1906)  评论(0编辑  收藏  举报