让网络请求简单点——Volley框架(下)

来源:互联网 发布:英汉双语阅读软件 编辑:程序博客网 时间:2024/05/20 23:57

简单点,说话的方式简单点……(《演员》薛之谦)

这篇博客,我们将学习一下Volley加载图片的介绍及用法。

学习目标(括号内是需要用到的类)

  1. 缓存功能简单介绍(LruCache、ImageCache)
  2. 加载网络图片及监听(ImageRequest、ImageLoader、NetworkImageView)

1.准备工作

我们新建一个项目VolleyImageDemo;这里我在写一下使用Volley框架的准备工作。

  • 添加Volley的jar包
  • 添加网络权限

这样就可以使用Volley了。

2.ImageRequest的使用

同样,我们新建类继承自Application,并创建全局的请求队列,代码如下:

public class MyApplication extends Application {public static RequestQueue queues;@Overridepublic void onCreate() {    super.onCreate();    queues = Volley.newRequestQueue(getApplicationContext());}public static RequestQueue getHttpQueues() {    return queues;}}

这里与Volley框架(上、中)中的请求队列无异,不再过多解释。

然后我们在MainActivivty的布局文件里创建一个普通的ImageView,代码如下:

<ImageView    android:id="@+id/iv_img"    android:layout_width="wrap_content"    android:layout_height="wrap_content" />

然后我们在MainActivity.java里将其实例化,代码如下:

private ImageView iv_img;iv_img = (ImageView) findViewById(R.id.iv_img);

下面我们创建一个ImagerRequest类,代码如下:

ImageRequest request = new ImageRequest(url, listener, maxWidth,maxHeight, decodeConfig, errorListener);

下面我们看一下ImagerRequest的6个参数:

  • 第一个参数:请求图片的url地址;
  • 第二个参数:请求成功的监听事件;
  • 第三个参数:请求的图片要显示出来的宽度;
  • 第四个参数:请求的图片要显示出来的高度;
  • 第五个参数:对请求的图片的解码方式;
  • 第六个参数:请求失败的监听事件。

下面我将参数填充一下,代码如下:

ImageRequest request = new ImageRequest(url, new Listener<Bitmap>() {        @Override        public void onResponse(Bitmap response) {// 请求成功的监听事件            iv_img.setImageBitmap(response);        }    }, 0, 0, Config.RGB_565, new Response.ErrorListener() {        @Override        public void onErrorResponse(VolleyError error) {// 请求失败的监听事件            iv_img.setBackgroundResource(R.drawable.ic_launcher);        }    });

这里的url我使用的图片网址为“private String url = "http://img3.imgtn.bdimg.com/it/u=2591627440,2371609101&fm=23&gp=0.jpg";”;这里我让请求成功时,使ImageView控件显示这张图片,请求失败时先是ic_launcher;至于图片的宽高,我设置为0,将显示原始图片的宽高;图片编码格式我设置为RGB。

现在我们运行一下:

这里写图片描述

OK!

3.完整请求——ImgeCache+LruCache+ImageLoader+ImageListener

首先我们在MainActivity里创建一个ImageLoader,代码如下:

ImageLoader loader = new ImageLoader(queue, imageCache);

我们可以看到,ImagerLoader对象有两个参数:queue和imageCache,这里的queue就是请求队列,我么设置为MyApplication.getHttpQueues(),而imageCache很明显就是一个ImageCache的对象,但是ImageCache不能直接使用,需要借助LruCache,所以我们先新建类BitmapCache添加接口ImageCache,实现两个自带的方法:getBitmap和putBitmap,代码如下:

public class BitmapCache implements ImageCache {public LruCache<String, Bitmap> cache;public int max = 10 * 1024;public BitmapCache() {    cache = new LruCache<String, Bitmap>(max) {        @Override        protected int sizeOf(String key, Bitmap value) {            return value.getRowBytes() * value.getHeight();        }    };}@Overridepublic Bitmap getBitmap(String url) {    return cache.get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) {    cache.put(url, bitmap);}}

这里我们新建了一个LruCache对象,然后我们定义一个LruCache的最大缓存的内存大小:max,这里定义为10M,如果缓存的图片大于10M,它会自动回收;在getBitmap里我们返回缓存里的图片;在putBitmap里放入到LruCache里面;然后我们编写构造方法,构造方法里我们实例化LruCache,然后实现以下它里面的sizeOf,返回Bitmap的大小。

这样我们的缓存就写好了!

然后将ImageLoader对象的第二个参数填充一下,代码如下:

ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),            new BitmapCache());

然后我们创建一个ImageListener,用来监听我们整个图片加载过程,代码如下:

ImageListener listener = ImageLoader.getImageListener(view, defaultImageResId, errorImageResId);

我们可以看到ImageListener对象有三个参数:

  • 第一个参数:ImageView控件
  • 第二个参数:默认的加载图片
  • 第三个参数:加载出错的时候

好了,我们填充一下,代码如下:

ImageListener listener = ImageLoader.getImageListener(iv_img,            R.drawable.ic_launcher, R.drawable.ic_launcher);

这里我们的默认加载图片和加载出错的图片都设置为ic_launcher。

下面我们就要加载我们的网络图片,代码如下:

loader.get(requestUrl, listener);loader.get(requestUrl, imageListener, maxWidth, maxHeight);

我们可以看到ImageLoader的构造方法有两种,四个参数的构造方法多了maxWidth和maxHeight,是自定义图片的宽高,这里我们使用两个参数的构造方法,代码如下:

loader.get(url, listener);

第一个参数是图片的url,第二个参数就是ImageListener的对象。

完成!我们运行一下:

这里写图片描述

这样就是一个完整的网络图片请求了!

4.使用Volley的NetworkImageView实现网络图片加载

我们首先需要创建一个控件,代码如下:

<com.android.volley.toolbox.NetworkImageView    android:id="@+id/networkImageView"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginTop="30dp" />

然后我们绑定一下控件,代码如下:

private NetworkImageView netImageView;netImageView = (NetworkImageView) findViewById(R.id.networkImageView);

NetworkImageView用起来就比较简单了,我们使用它的setImageUrl()方法,代码如下:

netImageView.setImageUrl(url, imageLoader);

第一个参数就是图片的url,而第二个参数我们发现是ImageLoader对象,所以我们在使用NetworkImageView时也需要使用ImageLoader,这里我们使用刚刚写好的ImageLoader,这样就可以使用了,另外我们可以用setDefaultImageResId()方法设置一下加载的默认图片,使用setErrorImageResId()方法设置一下加载失败的图片,代码如下:

ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(),            new BitmapCache());netImageView.setDefaultImageResId(R.drawable.ic_launcher);netImageView.setErrorImageResId(R.drawable.ic_launcher);netImageView.setImageUrl(url, loader);

这里的默认图片和加载失败图片我还是使用的ic_launcher。

好了,运行程序:

这里写图片描述

这样,我们的Volley的所有基本用法就写完了,关于Volley的具体使用还要多多实践!!!


让网络请求简单点——Volley框架(上)
让网络请求简单点——Volley框架(中)


袁程序猿的CSDN博客:安卓学习心得


往期回顾:
让网络请求简单点——Volley框架(中)
让网络请求简单点——Volley框架(上)
让你的电脑变成windows+安卓双系统
安卓四大组件——ContentProvider
SQLite详解
小程序发布,你方了吗?
安卓四大组件——Service(服务)
安卓四大组件——BroadcastReceiver(广播)
搞懂 res ->values + res ->drawable : 资源
界面美化 —— 布局
Intent——把两个Activity关联起来!
常用控件
关于Activity的生命周期

1 0
原创粉丝点击