Android 网络连接:Volley(齐射)之ImageRequest与NetworkImageView网络图片下载

来源:互联网 发布:手机强制删除文件软件 编辑:程序博客网 时间:2024/06/06 02:49

一、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) {                }            });            //注意最后将请求放入请求队列中            queue2.add(imgrequest);

二、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 mImageLoader;        }    }

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 queue;    }}

2.2.3NewWorkImageView的使用

//因为我们将ImageLoader等的获得进行了封装,因此直接调用就可以了//当然我们也可以直接写出,但是那样比较容易浪费空间,不建议那样写networkImageView.setImageUrl(url, ((MyApplication)getApplication()).getImageLoader());

三、ImageRequest与NewWorkImageView

这里将他们两个的关系提出来:
值得一提的是ImageLoader与NewWorkImageView的内部都是使用了ImageRequest进行操作的,也就是说imageRequest是本质,这也是我将ImageRequest与NewWorkImageView放在一起讨论的原因。

1 0