首页 > 移动平台 > 详细

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

时间:2016-07-02 06:58:08      阅读:242      评论:0      收藏:0      [点我收藏+]


题记——

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

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

        有缘而来,无缘而去,

        识自本心,见自本性

        不起妄缘,无心无为

        自由自在,动静自如

        冷暖自知,则是修行


技术分享





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请求




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

原文:http://blog.csdn.net/zl18603543572/article/details/51804704

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!