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

一、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

Android 网络连接:Volley(齐射)之ImageRequest与NetworkImageView网络图片下载_第1张图片
  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放在一起讨论的原因。

你可能感兴趣的:(Android 网络连接:Volley(齐射)之ImageRequest与NetworkImageView网络图片下载)