标签:
为了更方便的使用Volley中的图片请求,我们同样先在VolleyController类中封装一个ImageLoader
package com.javen.volley; import android.content.Context; import android.text.TextUtils; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.Volley; public class VolleyController { // 创建一个TAG,方便调试或Log private static final String TAG = "VolleyController"; // 创建一个全局的请求队列 private RequestQueue reqQueue; private ImageLoader imageLoader; // 创建一个static ApplicationController对象,便于全局访问 private static VolleyController mInstance; private Context mContext; private VolleyController(Context context) { mContext=context; } /** * 以下为需要我们自己封装的添加请求取消请求等方法 */ // 用于返回一个VolleyController单例 public static VolleyController getInstance(Context context) { if (mInstance == null) { synchronized(VolleyController.class) { if (mInstance == null) { mInstance = new VolleyController(context); } } } return mInstance; } // 用于返回全局RequestQueue对象,如果为空则创建它 public RequestQueue getRequestQueue() { if (reqQueue == null){ synchronized(VolleyController.class) { if (reqQueue == null){ reqQueue = Volley.newRequestQueue(mContext); } } } return reqQueue; } public ImageLoader getImageLoader(){ getRequestQueue(); //如果imageLoader为空则创建它,第二个参数代表处理图像缓存的类 if(imageLoader==null){ imageLoader=new ImageLoader(reqQueue, new LruBitmapCache()); } return imageLoader; } /** * 将Request对象添加进RequestQueue,由于Request有*StringRequest,JsonObjectResquest... * 等多种类型,所以需要用到*泛型。同时可将*tag作为可选参数以便标示出每一个不同请求 */ public <T> void addToRequestQueue(Request<T> req, String tag) { // 如果tag为空的话,就是用默认TAG req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); } // 通过各Request对象的Tag属性取消请求 public void cancelPendingRequests(Object tag) { if (reqQueue != null) { reqQueue.cancelAll(tag); } } }
ImageLoader imageLoader=VolleyController.getInstance(context).getImageLoader();
NetworkImageView
,几行代码就可以搞定//将NetworkImageView布局在布局文件中 NetworkImageView imageView=(NetworkImageView)findViewById(R.id.networkimageview); //需要用到imageLoader imageView.setImageUrl(url,imageLoader);
如果要将图片直接载入ImageView,可以通过以下方法:
ImageLoader imageLoader=VolleyController.getInstance(context).getImageLoader(); imageLoader.get(url,new ImageListener(){ @Override public void onResponse(ImageContainer response,boolean arg) { if(response.getBitmap()!=null){ //设置imageView // imageView.setImageBitmap(response.getBitmap()); } } @Override public void onErrorResponse(VolleyError error){ L.e("Image Error"+error.getMessage()); } });
Volley有着强大的缓存机制用来维护请求到的缓存,这节省了不必要的网络消耗和等待时间,下面是一些关于缓存的常用方法
Cache cache=VolleyController.getInstance(context).getRequestQueue().getCache(); Entry entry=cache.get(url); if(entry!=null){ try{ String data=new String(entry.data,"Utf-8"); //处理data,将其转化为JSON,XML,Bitmap等等 }catch(Exception e){ e.printStackTrace(); } }else{ //缓存中不存在,做网络请求 }
VolleyController.getInstance(context).getRequestQueue().getCache().invalidate(url,true);
VolleyController.getInstance(context).getRequestQueue().getCache().remove(url);
VolleyController.getInstance(context).getRequestQueue().getCache().remove(url);
VolleyController.getInstance(context).getRequestQueue().getCache()clear(url);
综上,已经学完了Volley框架的使用,在实际应用中遇到具体的问题需要具体考虑,必要时要学会查阅资料,除了以上几篇提到的参考资料,最好能FQ去看看google官方关于Volley的文档。
参考资料:Android working with Volley Library blog
标签:
原文地址:http://www.cnblogs.com/zyw-205520/p/4950535.html