一、ImageRequest
不知道将ImageRequest放在这里进行介绍是否合适,因为毕竟它属于一个请求队列,与StringRequest、JsonRequest、JsonArrayRequest请求差不多,前面的三种都是用于请求文本类型的,而ImageRequest是请求的图片,但是同样的他们太都离不开RequestQueue,都必须添加到请求队列中。
1、1使用步骤
(1)在布局文件中添加ImageView控件,用于网络图片的显示
(2)创建请求队列RequestQueue
(3)创建ImageRequest
1.2示例代码段
//此处是对RequestQueue的单例,具体代码在后面展示
//可以直接使用RequestQueue queue2=new RequestQueue();代替
RequestQueue queue2=((MyApplication)getApplication()).getQueue();
String url2="http://pic3.zhongsou.com/image/3800f20b9d5a32a494f.jpg";
//参数:url、监听器、图片最大高度与宽度,写0则是按照原图大小显示
ImageRequest imgrequest=new ImageRequest(url2, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap arg0) {
imgview.setImageBitmap(arg0);
}
}, 0, 0, Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
});
//注意最后将请求放入请求队列中
二、NewWorkImageView
NewWorkImageView的使用调用了Volley的ImageLoader、ImageCache、Lrucache,看起来比较麻烦,当然我们也可以直接使用google原代码中给出的单例(后面代码中的MySingleton,这里进行单例的主要目的是不要有过多的请求队列和创建多个ImageLoader),也可以自己写一个封装类来获得,
2、1使用步骤
1、首先在布局中添加networkImageView(注意写全包名)
com.android.volley.toolbox.NetworkImageView
android:id="@+id/networkImageview"
android:layout_width="400dp"
android:layout_height="400dp"
android:layout_gravity="center_horizontal"
2、创建ImageLoader,对它进行单例(其中涉及到ImageCache、Lrucache)
3、通过networkImageView对单例的内容进行获得ImageLoader加载图片
2、2示例
2.2.1google给出的单例
public class MySingleton
private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mCtx;
//只产生一次
private MySingleton(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
mImageLoader = new ImageLoader(mRequestQueue,
new ImageLoader.ImageCache() {
//写在ImageLoader内部,证明LruCache是属于它的那个
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
//单例模式,添加synchronized 防止线程过多时出问题
public static synchronized MySingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new MySingleton(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
//在没有请求的情况下才创建,否则不进行创建,调用没有被回收的
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getImageLoader() {
return
2.2.2自己写的获得RequestQueue和ImageLoader
使用自己写的在调用的时候需要注意强制造型
public class MyApplication extends Application
private RequestQueue queue;
private ImageLoader imageLoader;
private ImageCache imageCache;
//注意在manifest中添加<application name+包名+类名>
@Override
public void onCreate() {
super.onCreate();
if (queue == null) {
queue = Volley.newRequestQueue(this);
}
imageCache=new ImageCache() {
final LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(20);
@Override
public void putBitmap(String arg0, Bitmap arg1) {
cache.put(arg0, arg1);
}
@Override
public Bitmap getBitmap(String arg0) {
return cache.get(arg0);
}
};
imageLoader=new ImageLoader(queue, imageCache);
}
public ImageLoader getImageLoader() {
return imageLoader;
}
public RequestQueue getQueue() {
return
2.2.3NewWorkImageView的使用
//因为我们将ImageLoader等的获得进行了封装,因此直接调用就可以了
//当然我们也可以直接写出,但是那样比较容易浪费空间,不建议那样写
networkImageView.setImageUrl(url, ((MyApplication)getApplication()).getImageLoader());
三、ImageRequest与NewWorkImageView
这里将他们两个的关系提出来:
值得一提的是ImageLoader与NewWorkImageView的内部都是使用了ImageRequest进行操作的,也就是说imageRequest是本质,这也是我将ImageRequest与NewWorkImageView放在一起讨论的原因。