关键字:图片缓存
LruCache
ImageCache
NetworkImageView
ImageRequest
ImageLoader
前言:上篇笔记 记录了Volley
的简单用法,进行简单的GET、POST请求。这篇文章将记录Volley
加载、缓存图片的用法。
Volley
还可以进行图片的加载和缓存,可以利用ImageRequest
对象简单、方便地进行网络图片的获取。ImageLoader
用于获取或缓存图片。NetworkImageView
是Volley提供的一个自定义View,可直接设置网络图片。
1. 使用ImageRequest
简单地进行网络图片的获取
String url = "https://images.unsplash.com/photo-1445251836269-d158eaa028a6?fit=crop&fm=jpg&h=625&ixlib=rb-0.3.5&q=80&w=1375";
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//构建ImageRequest 实例
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//给imageView设置图片
myImageView.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//设置一张错误的图片,临时用ic_launcher代替
myImageView.setImageResource(R.drawable.ic_launcher);
}
});
requestQueue.add(request);
注意:在构建ImageRequest
实例时,需要传递七个参数(六个参数的重载方法已过时,少一个ScaleType
参数)
这七个参数类型分别为:
-
String
: 要获取的图片地址 -
Response.Listener<Bitmap>
: 获取图片成功的回调 -
int
:maxWidth
,获取图片的最大宽度,会自动进行压缩或拉伸,设置为0,即获取原图 -
int
:maxHeight
,同上 -
ScaleType
:显示的类型,居中,平铺等 -
Config
:图片类型,如:Bitmap.Config.RGB_565
-
Response.ErrorListener
: 获取图片失败的回调
2. 使用ImageLoader
缓存网络图片
使用ImageLoader
只需三步:
- 实例化ImageLoader
- 设置监听器
- 获取图片
代码如下:
MainActivity.java
文件:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//1.实例化ImageLoader
ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
//2.设置监听器
ImageLoader.ImageListener listener =
ImageLoader.getImageListener(myImageView, R.drawable.ic_launcher, R.drawable.ic_launcher);
//3.获取图片
loader.get(url, listener);
BitmapCache.java
文件:
public class BitmapCache implements ImageLoader.ImageCache {
//LruCache对象
private LruCache<String, Bitmap> lruCache ;
//设置最大缓存为10Mb,大于这个值会启动自动回收
private int max = 10*1024*1024;
public BitmapCache(){
//初始化 LruCache
lruCache = new LruCache<String, Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return lruCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
lruCache.put(url, bitmap);
}
}
说明:
-
ImageLoader
构造器需要两个参数,requestQueue
是熟悉的请求队列,imageCache
是图片缓存对象,需要自定义类实现imageCache
对象。使用LruCache
来作为具体的图片缓存对象。 -
ImageLoader.getImageListener()
需要三个参数:ImageView
实例,默认的图片资源,错误显示的图片资源 -
ImageLoader
调用get(ImageURL, listener)
方法,获取图片
3. NetworkImageView的使用
layout_main.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_horizontal_margin" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="获取图片"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/mNetworkImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
BitmapCache.java
文件:同“使用ImageLoader缓存网络图片”。
MainActivity.java
文件:
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
//实例化ImageLoader
ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
//设置默认图片
mNetworkImageView.setDefaultImageResId(R.drawable.ic_launcher);
//设置错误图片
mNetworkImageView.setErrorImageResId(R.drawable.ic_launcher);
//设置图片url和ImageLoader
mNetworkImageView.setImageUrl(url,loader);
网友评论