1,介绍

  • Volley是什么?

    • 2013年Google I/O大会上推出的网络请求和图片加载框架

    • 其优点是api简单,性能优秀

    • 非常适合数据量不大但是通信频繁的网络请求,而对于大数据量的操作,如文本下载,表现则没有那么好

    • Volley内部仍然是使用的HttpURLConnection和HttpClient进行网络请求的,只是对于不同的Android版本进行了响应的切换,2.3之前使用的HttpClient,2.3之后使用的是HttpURLConnection

  • 为什么用Volley,相比XUtil,Volley解决了以下问题:

    • 当用户finish当前的Activity的时候,而当前Activity正在进行网络请求,Volley支持取消网络请求

    • 当用户旋转屏幕,Activity重新创建,那么同样的网络请求会从新发送,而Volley支持对重复的请求进行缓存

    • 支持多样的网络请求返回封装

2,使用准备

【1】添加依赖和权限

  • 添加依赖

compile 'com.android.volley:volley:1.0.0'compile 'com.google.code.gson:gson:2.8.0'
  • 添加网络请求权限

 

【2】Volley中的核心类

  • Request,请求类,有几个实现类

    • StringRequest:请求的时候直接回来一个String

    • JsonObjectRequest:请求的时候直接回来一个JsonObject

    • JsonArrayRequest:请求的时候直接回来一个JsonArray

    • ImageRequest:请求的时候直接回来一个Bitmap

    • 自定义请求:一会我们会结合gson

  • RequestQueue:请求队列,用来执行Request的

  • ImageLoader:图片加载的类

  • NetWorkImageView:继承自ImageView,可以直接加载网络图片

3,实现逻辑

【1】Volley get请求

  • 接口文档

 

  • get请求

private void volleyGet() {    //1.创建请求队列    RequestQueue requestQueue = Volley.newRequestQueue(this);    //2.创建请求对象    StringRequest request = new StringRequest(Api.TEST, new Response.Listener() {        @Override        public void onResponse(String response) {            tvResult.setText(response);        }    }, errListener);    //3.执行请求    requestQueue.add(request);}Response.ErrorListener errListener = new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError error) {        tvResult.setText(error.getMessage());    }};

 

【2】Volley post请求

  • 接口文档

  • Volley内部没有提供设置请求参数,需要我们自定义进行封装

public class PostRequest extends StringRequest     public PostRequest(String url, Response.Listener listener, Response.ErrorListener errorListener) {        super(Method.POST,url, listener, errorListener);    }    HashMap map = new HashMap<>();    @Override    protected Map getParams() throws AuthFailureError {        return map;    }    /**     * 添加请求体参数     * @param key     * @param value     */    public void addPostParams(String key,String value){        map.put(key,value);    }
  • post请求

private void volleyPost() {    //1.创建请求队列    RequestQueue requestQueue = Volley.newRequestQueue(this);    //2.创建请求对象    PostRequest request = new PostRequest(Api.LOGIN, new Response.Listener() {        @Override        public void onResponse(String response) {            tvResult.setText(response);        }    },errListener);    //设置请求体参数    request.addPostParams("username","The Monkey King!");    request.addPostParams("password","golden cudgel!");    //3.执行请求    requestQueue.add(request);}//失败回调Response.ErrorListener errListener = new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError error) {        tvResult.setText(error.getMessage());    }};

 

【3】ImageRequest进行请求

  • 接口文档

  • 进行图片请求

private void imageReq() {    RequestQueue queue = Volley.newRequestQueue(this);    //参1 URL, 参2 Listener  参3 参4  图片的解析的大小 参5 颜色的模式  参6 失败监听    ImageRequest request = new ImageRequest(Api.IMAGE, new Response.Listener() {        @Override        public void onResponse(Bitmap response) {            image.setImageBitmap(response);        }    }, 400, 400, Bitmap.Config.RGB_565, new Response.ErrorListener() {        @Override        public void onErrorResponse(VolleyError error) {            text.setText(error.getMessage());        }    });    queue.add(request);}

【4】Volley中的ImageLoader使用

  • 创建本地缓存

public class VolleyCache implements ImageLoader.ImageCache {    private LruCache lruCache = null;    //谷歌建议的:app最大内存的1/8    int maxSize = (int) (Runtime.getRuntime().maxMemory()/8);//缓存最大值     public VolleyCache(){        lruCache = new LruCache(maxSize){            @Override            protected int sizeOf(String key, Bitmap value) {                return value.getHeight()*value.getRowBytes();            }        };    }    @Override    public Bitmap getBitmap(String url) {        return lruCache.get(url);    }    @Override    public void putBitmap(String url, Bitmap bitmap) {        lruCache.put(url,bitmap);    }}
  • 进行图片下载,并且进行缓存,

private void loadImage() {    RequestQueue queue = Volley.newRequestQueue(this);    //创建本地缓存    VolleyCache volleyCache = new VolleyCache();    ImageLoader imageLoader = new ImageLoader(queue, volleyCache);    //参1 Imageview ,参2 加载失败的图片, 参3 加载中的图片    ImageLoader.ImageListener listener = ImageLoader.getImageListener(image, R.mipmap.ic_launcher, R.mipmap.ic_launcher);    //设置URL,设置监听    imageLoader.get(Api.IMAGE,listener);}

 

【5】Volley 取消中断网络请求

  • 先创建一个请求,并且附加标识

  @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView) findViewById(R.id.text);        image = (ImageView) findViewById(R.id.image);        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                cancelRequest();            }        });        queue = Volley.newRequestQueue(this);        //一开始发送一个请求        StringRequest request = new StringRequest(Api.DELAY, new Response.Listener() {            @Override            public void onResponse(String response) {                text.setText(response);            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                text.setText(error.getMessage());            }        });        //添加标识        request.setTag("a");        queue.add(request);//执行请求    }
  • 取消网络请求 

private void cancelRequest() {    //取消    queue.cancelAll("a");}

 

【7】Volley 自定义请求,返回GsonRequest,进行封装解

  • 创建GsonRequest继承Request

import com.android.volley.NetworkResponse;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;import com.google.gson.Gson;import java.io.UnsupportedEncodingException;public class GsonRequest extends Request{    private Class clazz;    private Response.Listener mListener;    public GsonRequest(String url,Class clazz, Response.Listener mListener,Response.ErrorListener listener) {        super(Method.GET, url, listener);        this.clazz = clazz;        this.mListener = mListener;    }    //仿照StringRespnose    @Override    protected Response parseNetworkResponse(NetworkResponse response) {        String parsed;        try {            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));        } catch (UnsupportedEncodingException e) {            parsed = new String(response.data);        }        //将json字符串解析为javabean        T t = new Gson().fromJson(parsed, clazz);        return Response.success(t, HttpHeaderParser.parseCacheHeaders(response));    }    @Override    protected void deliverResponse(T response) {        mListener.onResponse(response);    }}
  • 调用进行网络访问返回是Gson格式

queue = Volley.newRequestQueue(this); //进行初始化//参数1  URL,参2 JAVAbean 参3 成功监听,参4 失败监听GsonRequest gsonRequest = new GsonRequest<>(Api.TEST, User.class, new Response.Listener() {    @Override    public void onResponse(User response) {        text.setText(response.name);    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError error) {    }});queue.add(gsonRequest);

 

【8】Volley 的二次封装

  • Volley封装返回一个Gson

  • Volley封装返回一个图片设置到Imageview上

  • Volley封装取消请求

import android.animation.ObjectAnimator;import android.content.Context;import android.widget.ImageView;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.Volley;/**** 对Volley的二次封装*/public class VolleyHelper {    RequestQueue queue;    VolleyCache volleyCache = new VolleyCache();    ImageLoader imageLoader = new ImageLoader(queue, volleyCache);    private static VolleyHelper mInstance = null;    private VolleyHelper(Context context){        queue = Volley.newRequestQueue(context);    }    public static VolleyHelper create(Context context){        if(mInstance==null){            mInstance = new VolleyHelper(context);        }         return mInstance;    }    public void cancelRequest(Object tag){        queue.cancelAll(tag);    }    public  void execRequest(String url,Class clazz, Response.Listener success,                                Response.ErrorListener error){        execRequest(url,null,clazz,success,error);    }    /**     * 执行请求的方法     * @param url     * @param clazz     * @param success     * @param error     * @param      */    public  void execRequest(String url, Object tag, Class clazz, Response.Listener success,                                Response.ErrorListener error){        GsonRequest tGsonRequest = new GsonRequest<>(url, clazz, success, error);        if(tag!=null){            tGsonRequest.setTag(tag);        }        queue.add(tGsonRequest);    }    /**     * 加载图片的方法     * @param url     * @param imageView     */    public void loadImage(String url, ImageView imageView){        ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);        imageLoader.get(url,listener);    }}
  • Volley请求返回一个Gson

import com.android.volley.NetworkResponse;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;import com.google.gson.Gson;import java.io.UnsupportedEncodingException;public class GsonRequest extends Request{    private Class clazz;    private Response.Listener mListener;    public GsonRequest(String url,Class clazz, Response.Listener mListener,Response.ErrorListener listener) {        super(Method.GET, url, listener);        this.clazz = clazz;        this.mListener = mListener;    }    @Override    protected Response parseNetworkResponse(NetworkResponse response) {        String parsed;        try {            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));        } catch (UnsupportedEncodingException e) {            parsed = new String(response.data);        }        //将json字符串解析为javabean        T t = new Gson().fromJson(parsed, clazz);        return Response.success(t, HttpHeaderParser.parseCacheHeaders(response));    }    @Override    protected void deliverResponse(T response) {        mListener.onResponse(response);    }}

 

更多相关文章

  1. Android利用Fiddler进行网络数据抓包【怎么跟踪微信请求】
  2. Android笔记---常用控件以及用法
  3. Android(安卓)VideoView播放网络视频
  4. 【源码】Android(安卓)圆形图片之 CircleImageView 源码解读
  5. Android(安卓)手势检测实战 打造支持缩放平移的图片预览效果(下)
  6. Google Android(安卓)SDK开发范例大全
  7. Android屏幕适配小结
  8. Android异步加载学习笔记之三:用AsyncTask实现ListView中的图片数
  9. Android实践--监测网络状态

随机推荐

  1. Android学习计划表
  2. Android菜鸟必看:解析应用的基本原理
  3. android数据库存储-sqllite
  4. android:scrollbars属性和弹出键盘的问题
  5. Android开发屏幕适配
  6. Android绘制优化----系统显示原理
  7. android工具之adb monkey
  8. delphi xe 之路(28)Android SDK API 层次
  9. Android与服务器端数据交互(1)
  10. Android libyuv应用系列(二)libyuv在Androi