Volley网络请求框架简析——Android网络请求框架(三)

原创 2016年07月02日 00:37:42


题记——

        人来到这个世界上,只有两件事情,生与死,

        一件事完了,另一件事还急什么?

        有缘而来,无缘而去,

        识自本心,见自本性

        不起妄缘,无心无为

        自由自在,动静自如

        冷暖自知,则是修行






1、初始化一个消息请求队列以及网络请求工具类对象


/**
 * Created by androidlongs on 16/7/1.
 * 网络请求访问框架
 */
public class VollyRequestUtils {
    /**
     * Volley框架使用工具类对象
     */
    private static VollyRequestUtils vollyRequestUtils;
    /**
     * 网络消息请求队列
     */
    private static RequestQueue requestQueue;
    private VollyRequestUtils() {
        /**
         * 初始化请求消息队列
         */
        getVolleyQueyInstanse();
    }

    /**
     * 获取消息工具类请求对象实体
     *
     * @return
     */
    public static VollyRequestUtils getInstance() {
        if (vollyRequestUtils == null) {
            synchronized (VollyRequestUtils.class) {
                if (vollyRequestUtils == null) {
                    vollyRequestUtils = new VollyRequestUtils();
                }
            }
        }
        return vollyRequestUtils;
    }

    /**
     * 获取消息请求队列
     */
    public void getVolleyQueyInstanse() {
        if (requestQueue == null) {
            synchronized (VollyRequestUtils.class) {
                if (requestQueue == null) {
                    requestQueue = Volley.newRequestQueue(App.getContext());
                }
            }
        }

    }

}


备注说明:

        这里采用单例设计模式,其中创建请求消息队列 requestQueue传入的是一个Application对象 

public class App extends Application {
    private  static Context context;
    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    }
    public static  Context getContext(){
        return context;
    }
}

切记要在程序的清单文件中引入


2、Get网络请求返回String 

    /**
     * get 请求
     *
     * @param url           网络请求url
     * @param netTag        网络请求标识
     * @param isCache       设置缓存标识
     * @param listener      请求成功回调
     * @param errorlistener 请求失败回调
     */
    public void asyGetStringRequest(String url, String netTag, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorlistener) {

        /**
         * 在发起请求前先取消队列中有此标签的网络,避免多次重复请求问题
         */
        requestQueue.cancelAll(netTag);
        /**
         * 获取请求对象
         * 并设置相关的监听
         */
        StringRequest request = new StringRequest(Request.Method.GET, url, listener, errorlistener);
        /**
         * 设置网络请求标识
         */
        request.setTag(netTag);
        /**
         * 设置网络请求缓存
         */
        request.setShouldCache(isCache);
        /**
         * 添加到队列中
         */
        requestQueue.add(request);
    }


使用方法:

        final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
        final String netTag = "getString";
        
        VollyRequestUtils.getInstance().asyGetStringRequest(url, netTag, false, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                System.out.println("get String success " + s);
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                System.out.println("get String onErrorResponse " + volleyError.getMessage());
            }
        });


3、POST请求提交参数形式为KEY - VALUE 形式请求


    /**
     * post请求 提交KEY - VALEU 形式的数据
     *
     * @param url
     * @param netTag
     * @param map
     * @param isCache
     * @param listener
     * @param errorListener
     */
    public void asyncPostStringQuest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<String> listener, Response.ErrorListener errorListener) {

        /**
         * 取消此标识下的所有网络请求,避免重复提交
         */
        requestQueue.cancelAll(netTag);
        /**
         * 获取Request对象 并封装相应的参数
         */
        StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                /**
                 * 封装请求参数
                 */
                if (map != null && !map.isEmpty()) {
                    return map;
                } else {
                    return super.getParams();
                }
            }
        };
        /**
         * 设置缓存
         */
        request.setShouldCache(isCache);
        /**
         * 设置网络请求标识
         */
        request.setTag(netTag);
        requestQueue.add(request);
    }
使用方法:

        final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
        final String netTag = "postString";
        
        Map<String, String> map = new HashMap<>();
        map.put("username", "postUsername");
        map.put("password", "postPassword");
        
        VollyRequestUtils.getInstance().asyncPostStringQuest(url, netTag, map, false, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                System.out.println("post String success " + s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                System.out.println("post String onErrorResponse " + volleyError.getMessage());
            }
        });
    }

4、post请求提交参数为JSON形式


    /**
     * 提交 JSON数据到服务器
     *
     * @param url           网络请求URL
     * @param netTag        网络请求标识
     * @param map           网络请求提交参数
     * @param isCache       缓存请求标识
     * @param listener      成功监听
     * @param errorListener 失败监听
     */
    public void asynePostJsonObjRequest(String url, String netTag, final Map<String, String> map, boolean isCache, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {

        requestQueue.cancelAll(netTag);
        /**
         * 封装参数
         */
        JSONObject object = new JSONObject();
        try {

            if (map != null && !map.isEmpty()) {
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    object.put(entry.getKey(), entry.getValue());
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        /**
         * 创建请求Request
         */
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object, listener, errorListener);
        /**
         * 设置网络请求标识
         */
        jsonObjectRequest.setTag(netTag);
        /**
         * 设置缓存
         */
        jsonObjectRequest.setShouldCache(isCache);
        requestQueue.add(jsonObjectRequest);
    }


使用方法:

        final String url = "http://172.19.1.45:8080/OkhttpAppLication/test";
        final String netTag = "postString";
        
        Map<String, String> map = new HashMap<>();
        map.put("username", "postUsername---45");
        map.put("password", "postPassword---45");
        
        VollyRequestUtils.getInstance().asynePostJsonObjRequest(url,netTag,map,false,new Response.Listener<JSONObject>(){

            @Override
            public void onResponse(JSONObject jsonObject) {
                JSONObject j = jsonObject;
            }
        },new Response.ErrorListener(){

            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });



5、加载图片请求

 /**
     * 加载图片请求
     * @param url            加载图片的URL
     * @param netTag         加载图片的网络请求标识
     * @param imageMaxWidth  加载图片的最大宽度
     * @param imageMaxHeight 加载图片的最大高度
     * @param listener       加载成功监听
     * @param errorListener  加载失败监听
     */
    public void asyPostImageRequest(String url, String netTag, int imageMaxWidth, int imageMaxHeight, Response.Listener<Bitmap> listener, Response.ErrorListener errorListener) {
        requestQueue.cancelAll(netTag);

        /**
         * 创建获取request
         * 并设置相关的监听与参数
         */

        ImageRequest request = new ImageRequest(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX, Bitmap.Config.ARGB_8888, errorListener);

        /**
         * 设置加载缓存
         */
        request.setShouldCache(true);
        /**
         * 设置网络请求标识
         */
        request.setTag(netTag);
        /**
         * 设置请求超时时间
         */
        request.setRetryPolicy(new DefaultRetryPolicy(15000,3000,3000));
        requestQueue.add(request);
    }


使用方法

 final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";
        final String netTag = "imagerequest";
        
        VollyRequestUtils.getInstance().asyPostImageRequest(url, netTag, screeWidht, screeHeight, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
                System.out.println("image request success ");
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                System.out.println("image request faile ");
            }
        });



6、使用Volley内置ImageLoader 加载图片


    /**
     * 加载多张图片
     *
     * @param url
     * @param imageView
     * @param imageMaxWidth
     * @param imageMaxHeight
     */
    public void asyVolleyImageLoaderRequest(String url, ImageView imageView, int imageMaxWidth, int imageMaxHeight) {
        ImageLoader imageLoaderInstance = getImageLoaderInstance();
        // getImageListener(imageView控件对象,默认图片地址,失败图片地址);
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
        // get(图片地址,listener,宽,高);自动帮你处理图片的宽高再也不怕大图片的oom了
        imageLoaderInstance.get(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX);
    }

    private static ImageLoader imageLoader;

    /**
     * 获取 Imageloader对象 
     * @return
     */
    private ImageLoader getImageLoaderInstance() {
        if (imageLoader == null) {
            synchronized (VollyRequestUtils.class) {
                if (imageLoader == null) {
                    imageLoader = new ImageLoader(requestQueue, new BitmapLruCache());
                }
            }
        }
        return imageLoader;
    }


使用方法

        final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg";
        final String netTag = "postString";
        
        VollyRequestUtils.getInstance().asyVolleyImageLoaderRequest(url, imageView, screeWidht, screeHeight);

在这里使用到了一个缓存对象类

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

        return cacheSize;
    }

    public BitmapLruCache() {
        this(getDefaultLruCacheSize());
    }

    public BitmapLruCache(int sizeInKiloBytes) {
        super(sizeInKiloBytes);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight() / 1024;
    }

    @Override
    public Bitmap getBitmap(String url) {
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        put(url, bitmap);
    }

}


7、使用Volley提供的NetworkImageView加载图片


布局文件中的xml中使用方法

 <com.android.volley.toolbox.NetworkImageView
        android:layout_marginTop="10dp"
        android:id="@+id/network_image_view"
        android:layout_width="100dp"
        android:layout_height="100dp" />
    

java代码中的操作

 /**
     * 这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题,而且NetworkImageView还会根据你对图片设置的width和heigh自动压缩该图片不会产生多的内存,还有NetworkImageView在列表中使用不会图片错误
     *
     * @param iv
     * @param url
     */
    private void networkImageViewUse(NetworkImageView iv, String url) {
        ImageLoader imLoader = new ImageLoader(Volley.newRequestQueue(App.getContext()), new BitmapLruCache());
        iv.setDefaultImageResId(android.R.drawable.ic_menu_rotate);
        iv.setErrorImageResId(android.R.drawable.ic_delete);
        iv.setImageUrl(url, imLoader);
    }


8、自定义Request请求




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl18603543572/article/details/51804704

Android网络编程(三)Volley用法全解析

Volley想必很多人都用过,为了建立网络编程的知识体系,Volley是必须要讲的知识点,所以我这里有必要再次介绍一下Volley的使用。...
  • itachi85
  • itachi85
  • 2016年04月04日 13:01
  • 17278

Volley===Volley框架的基本使用方法

现在开发app,可以说离不开网络操作,今天给大家介绍一下android网络框架volley的使用方法。 volley简介 Volley主页 https://android.googleso...
  • IT1039871366
  • IT1039871366
  • 2016年01月29日 17:14
  • 6909

android studio 导入volley

Android library project 导入 volley
  • Half_open
  • Half_open
  • 2017年07月18日 20:28
  • 658

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

我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpUR...
  • sinyu890807
  • sinyu890807
  • 2014年04月10日 09:45
  • 309329

Volley

Volley是一个http库,它能够帮助Android Apps更方便的执行网络操作,更重要的是它更快速高效。 优点: 自动执行网络请求 高并发网络连接 通过标准的http的cache coh...
  • zhangyongfeiyong
  • zhangyongfeiyong
  • 2016年07月07日 19:36
  • 956

Android Volley完全解析

Android Volley完全解析(一),初识Volley的基本用法 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/...
  • ysh06201418
  • ysh06201418
  • 2015年06月10日 16:13
  • 88154

Android 网络通信框架Volley简介(Google IO 2013)

1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient...
  • t12x3456
  • t12x3456
  • 2013年07月02日 09:15
  • 557363

Android Volley 框架的使用(一)

Android Volley 框架的使用(一) 由于这部分内容较多,所以打算分成几个部分来写,这篇文章主要是从整体上介绍Volley框架的基本使用; 为什么要使用Volley框架开发android...
  • qwm8777411
  • qwm8777411
  • 2015年05月16日 20:30
  • 8170

Volley 框架的介绍和使用

转载请标明出处:http://blog.csdn.net/u011546655/article/details/45921025一:volley 简介究竟什么是volley呢,在以前的开发过程中,我们...
  • u011546655
  • u011546655
  • 2016年03月11日 14:57
  • 8349

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

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来...
  • u012602304
  • u012602304
  • 2018年01月26日 11:12
  • 59
收藏助手
不良信息举报
您举报文章:Volley网络请求框架简析——Android网络请求框架(三)
举报原因:
原因补充:

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