题记——
人来到这个世界上,只有两件事情,生与死,
一件事完了,另一件事还急什么?
有缘而来,无缘而去,
识自本心,见自本性
不起妄缘,无心无为
自由自在,动静自如
冷暖自知,则是修行
/** * 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; } }
/** * 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()); } });
/** * 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()); } }); }
/** * 提交 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) { } });
/** * 加载图片请求 * @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 "); } });
/** * 加载多张图片 * * @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); } }
布局文件中的xml中使用方法
<com.android.volley.toolbox.NetworkImageView android:layout_marginTop="10dp" android:id="@+id/network_image_view" android:layout_width="100dp" android:layout_height="100dp" />
/** * 这个控件在被从父控件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