Volley网络请求框架简析——Android网络请求框架(三)
2016-07-02 00:00
726 查看
摘要: 1.Volley的GET请求
2.Volley的Post请求
3.Volley的ImageRequest加载图片请求
4.Volley的ImageLoader加载图片请求
5.Volley的NetWorkImageView加载图片使用
6.Volley提交JSON数据
一件事完了,另一件事还急什么?
有缘而来,无缘而去,
识自本心,见自本性
不起妄缘,无心无为
自由自在,动静自如
冷暖自知,则是修行
备注说明:
这里采用单例设计模式,其中创建请求消息队列 requestQueue传入的是一个Application对象
切记要在程序的清单文件中引入
使用方法
使用方式
使用方法:
使用方法
使用方法
在这里使用到了一个缓存对象类
java代码中的操作
7、自定义Request请求
2.Volley的Post请求
3.Volley的ImageRequest加载图片请求
4.Volley的ImageLoader加载图片请求
5.Volley的NetWorkImageView加载图片使用
6.Volley提交JSON数据
题记——
人来到这个世界上,只有两件事情,生与死,一件事完了,另一件事还急什么?
有缘而来,无缘而去,
识自本心,见自本性
不起妄缘,无心无为
自由自在,动静自如
冷暖自知,则是修行
1、初始化一个消息请求队列以及网络请求工具类对象
[code=language-java] /** * 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对象
[code=language-java]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
[code=language-java] /** * 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); }
使用方法
[code=language-java] 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到服务器
[code=language-java] /** * 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); }
使用方式
[code=language-java] 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形式
[code=language-java] /** * 提交 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); }
使用方法:
[code=language-java] 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) { } });
4、Volley的ImageRequest加载图片请求
[code=language-java] /** * 加载图片请求 * @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); }
使用方法
[code=language-java] 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 "); } });
5、使用Volley内置ImageLoader来加载图片
[code=language-java] /** * 加载多张图片 * * @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; }
使用方法
[code=plain] final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg"; final String netTag = "postString"; VollyRequestUtils.getInstance().asyVolleyImageLoaderRequest(url, imageView, screeWidht, screeHeight);
在这里使用到了一个缓存对象类
[code=language-java] 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); } }
6、使用Volley提供的NetworkImageView加载图片
布局文件中的xml使用[code=language-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代码中的操作
[code=language-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); }
7、自定义Request请求
相关文章推荐
- Volley框架的使用(加载网络图片,加载json数据)
- Volley网络请求框架简析——Android网络请求框架(三)
- Volley框架(二):使用Volley加载图片
- 六、TCP C/S:Linux connect 超时设置
- HTTP
- android检测网络状态
- NBU 2430 war of energy
- web安全的HTTPS
- 讲给小白——程序、算法、机器学习、深度学习
- http://www.tuicool.com/articles/EjMJNz
- php soap连接https的wsdl报错SOAP-ERROR: Parsing WSDL:Couldn't load from
- QT 线程池 + TCP 小试(一)线程池的简单实现
- https的通信过程详解
- tcp的简单应用
- 简单socket的应用(一)
- TCP连接建立的三次握手理解
- 简单的android http连接
- Win2008 r2 iis7/iis7.5系统下HTTP重定向(301重定向)图文方法
- hdu5294(最短路+网络流)
- Spring中使用UrlResource获取网络资源的时候报java.io.FileNotFoundException错误