地址
CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/78144382郭霖:http://blog.csdn.net/guolinblog/article/details/17482165
经过上一篇的复习,对volley的StringRequest和JsonRequest的基本用法有了初步的了解,这篇文章来练习加载网络图片的用法。
目录
-
ImageRequest的用法
-
ImageLoader的用法
-
NetworkImageView的用法
-
链接
一. ImageRequest的用法
ImageRequest,也是继承自Request的,因此它的用法也是基本相同的,首先需要获取到一个RequestQueue对象,可以调用如下方法获取到:
RequestQueue mQueue = Volley.newRequestQueue(context);
然后去new出一个ImageRequest对象了,代码如下所示:
ImageRequest imageRequest = new ImageRequest("http://developer.android.com/images/home/aw_dac.png", //请求的网络图片地址new Response.Listener<Bitmap>() { //服务器访问成功的数据回调@Overridepublic void onResponse(Bitmap response) {imageView.setImageBitmap(response);}}, 0, 0,//限制图片的高度和宽度,0为不限制Config.RGB_565,//图片的属性 ARGB_8888new Response.ErrorListener() { //服务器访问失败的回调@Overridepublic void onErrorResponse(VolleyError error) {imageView.setImageResource(R.drawable.default_image);}});mQueue.add(imageRequest); //将imageRequest对象添加到mQueue运行
二. ImageLoader的用法
ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。由于ImageLoader已经不是继承自Request的了,所以它的用法也和我们之前学到的内容有所不同,总结起来大致可以分为以下四步:
-
创建一个RequestQueue对象。
-
创建一个ImageLoader对象。
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {@Overridepublic void putBitmap(String url, Bitmap bitmap) {}@Overridepublic Bitmap getBitmap(String url) {return null;}});
-
获取一个ImageListener对象。
ImageListener listener = ImageLoader.getImageListener(imageView, //用于显示imageView的对象R.drawable.default_image, //加载过程中显示的图片R.drawable.failed_image); //加载失败显示的图片
-
调用ImageLoader的get()方法加载网络上的图片。
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", //图片的地址listener);
如果对图有需要现在的话用:
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener, 200, 200);
运行的加载效果:
缓存机制的实现,新建一个BitmapCache并实现了ImageCache接口:
public class BitmapCache implements ImageCache {private LruCache<String, Bitmap> mCache;public BitmapCache() {int maxSize = 10 * 1024 * 1024;mCache = new LruCache<String, Bitmap>(maxSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getRowBytes() * bitmap.getHeight();}};}@Overridepublic Bitmap getBitmap(String url) {return mCache.get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) {mCache.put(url, bitmap);}}
这里我们将缓存图片的大小设置为10M,然后将第二个步骤改为:
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
将BitmapCache传后,即充分利用了ImageLoader的缓存优势了!
三. NetworkImageView的用法
NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:
-
创建一个RequestQueue对象。
-
创建一个ImageLoader对象。
-
在布局文件中添加一个NetworkImageView控件。
<com.android.volley.toolbox.NetworkImageViewandroid:id="@+id/network_image_view"android:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center_horizontal"/>
-
在代码中获取该控件的实例。
-
设置要加载的图片地址。
networkImageView.setDefaultImageResId(R.drawable.default_image); //加载中显示的图片networkImageView.setErrorImageResId(R.drawable.failed_image); //加载失败显示的图片networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", //加载的图片地址BitmapCache); //
NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存,这也是NetworkImageView最简单好用的一点吧。如果你不想对图片进行压缩的话,其实也很简单,只需要在布局文件中把NetworkImageView的layoutwidth和layoutheight都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。
四. 链接
>笔记10 | 学习整理静态static 和 终态final
本节结束