Android中关于Volley的使用(四)利用NetworkImageView来加载图片
来源:互联网 发布:蚂蚁金服 知乎 编辑:程序博客网 时间:2024/05/22 02:03
在使用Volley来从网络获取图片的时候,我们前面介绍了ImageRequest的使用,而其实Volley还提供了一个NetworkImageView类。利用这个类,我们可以更有效率地去从网络去获取图片,因为它里面帮我们多设置了一个缓存,帮我们自己去处理请求的队列。
NetworkImageView类的具体使用方式如下:
1)在XML中定义:
- <FrameLayout
- android:id="@+id/flImageContainer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@+id/gvImages"
- android:layout_margin="30dp" >
- <com.android.volley.toolbox.NetworkImageView
- android:id="@+id/nivTestView"
- android:layout_width="100dp"
- android:layout_height="100dp" >
- </com.android.volley.toolbox.NetworkImageView>
- </FrameLayout>
就相当于使用自定义的View,这里是com.android.volley.toolbox.NetworkImageView。
2)然后在Activity中使用:
- networkImageView = (NetworkImageView) findViewById(R.id.nivTestView);
- mQueue = Volley.newRequestQueue(this);
- LruImageCache lruImageCache = LruImageCache.instance();
- ImageLoader imageLoader = new ImageLoader(mQueue,lruImageCache);
- networkImageView.setDefaultImageResId(R.drawable.ic_launcher);
- networkImageView.setErrorImageResId(R.drawable.ic_launcher);
- networkImageView.setImageUrl(URLS[1], imageLoader);
第一步:我们还要创建一个RequestQueue。
第二步:我们要创建一个ImageLoader。
ImageLoader是NetworkImageView类中真正去跟网络打交道,获取图片的类,而在它的构造函数中,我们发现还需要去实现一个ImageCache接口的类,即上面的LruImageCache类,这是作为ImageLoader的内存缓存类,也就是通常所说的一级缓存了(L1)。
ImageCache是ImageLoader的内部接口,其定义如下:
- public interface ImageCache {
- public Bitmap getBitmap(String url);
- public void putBitmap(String url, Bitmap bitmap);
- }
- package com.lms.volleydemo;
- import android.graphics.Bitmap;
- import android.support.v4.util.LruCache;
- import com.android.volley.toolbox.ImageLoader.ImageCache;
- public class LruImageCache implements ImageCache{
- private static LruCache<String, Bitmap> mMemoryCache;
- private static LruImageCache lruImageCache;
- private LruImageCache(){
- // Get the Max available memory
- int maxMemory = (int) Runtime.getRuntime().maxMemory();
- int cacheSize = maxMemory / 8;
- mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
- @Override
- protected int sizeOf(String key, Bitmap bitmap){
- return bitmap.getRowBytes() * bitmap.getHeight();
- }
- };
- }
- public static LruImageCache instance(){
- if(lruImageCache == null){
- lruImageCache = new LruImageCache();
- }
- return lruImageCache;
- }
- @Override
- public Bitmap getBitmap(String arg0) {
- return mMemoryCache.get(arg0);
- }
- @Override
- public void putBitmap(String arg0, Bitmap arg1) {
- if(getBitmap(arg0) == null){
- mMemoryCache.put(arg0, arg1);
- }
- }
- }
利用了 LruCache 来作为缓存,然后实现 ImageCache 的 getBitmap 和 putBitmap 方法。
然后将上面创建的 mQueue 和 LruImageCache 作为参数传递给其构造函数,这样 ImageLoader 对象就创建了。
第三步:调用 NetworkImageView 的 setImageUrl 方法,在这里,将 ImageLoader 传给它,然后就可以了。不过 Volley 推荐呢,在设置url之前,可以调用其以下两个方法:
- /**
- * Sets the default image resource ID to be used for this view until the attempt to load it
- * completes.
- */
- public void setDefaultImageResId(int defaultImage) {
- mDefaultImageId = defaultImage;
- }
- /**
- * Sets the error image resource ID to be used for this view in the event that the image
- * requested fails to load.
- */
- public void setErrorImageResId(int errorImage) {
- mErrorImageId = errorImage;
- }
所以,我们在上面调用setImageUrl之前,也调用了这两个方法,其目的有两个:
1)调用 setDefaultImageResId,设置一个默认的图片显示,直到网络上的图片load完为止。
2)调用 setErrorImageResId,设置一个错误的图片,在网络加载过程中出错的时候展示。
下面我们来看看效果图:
上图中6个小图片呢,就是我们第一篇文章中利用ImageRequest来获取的网络图片了,而下面那一张稍大的,则是我们利用NetworkImageView来获取的图片了。
而除了在XML中定义,我们也可以直接在Java中动态创建,然后在Java中设置其url地址,其实我觉得这才是它最主要的用途,应该是用在展示大量网络图片的时候,效果会比较好。
- Android中关于Volley的使用(四)利用NetworkImageView来加载图片
- Android中关于Volley的使用(四)利用NetworkImageView来加载图片
- Android中关于Volley的使用(四)利用NetworkImageView来加载图片
- Android中关于Volley的使用(四)利用NetworkImageView来加载图片
- Android中关于Volley的使用(四)利用NetworkImageView来加载图片
- Android中关于Volley的使用(一)加载图片
- Android中关于Volley的使用(一)加载图片
- Android中关于Volley的使用(一)加载图片
- Android中关于Volley的使用(一)加载图片
- Android中关于Volley的使用(一)加载图片
- Volley(二) ImageRequest、Imageloader、NetworkImageView加载图片
- volley学习笔记(四):Android利用Volley异步加载数据(JSON和图片)完整示例
- Android结合volley的netWorkImageview实现图片文件缓存
- Android中关于Volley的使用(五)从RequestQueue开始来深入认识Volley
- Android中关于Volley的使用(五)从RequestQueue开始来深入认识Volley
- Android中关于Volley的使用(五)从RequestQueue开始来深入认识Volley
- Android中关于Volley的使用(二)从RequestQueue开始来深入认识Volley
- Android中关于Volley的使用(五)从RequestQueue开始来深入认识Volley
- 卫生,再加上为什么我们认为这是对流体,以及通风系统必备
- poj1845
- 无论是否值得外包搜索引擎营销
- SVN服务器搭建和使用(一)
- 我为什么要购买一台3D电视
- Android中关于Volley的使用(四)利用NetworkImageView来加载图片
- 数据的交换输出
- 找工作笔试面试那些事儿(2)---函数那些事
- 五年计划,以提高粉碎机
- C# 特性详解
- SVN服务器搭建和使用(二)
- 学习日记之迪米特法则、外观模式和 Effective C++
- 下载博尔特动画免费 - 法律途径
- DataGridView根据下拉列表显示数据