網誌文章封存
Volley: Google 自家制 Android Network Library – ImageLoader
上回: Google I/O 2013 (1) – Volley: Google 自家制 Android Network Library
初試試Google 的Volley Library , 發現是比從前簡單了一點兒,由於沒有任何的Document,只有上網找找人家的案例再從錯誤中學習一下。今次講一講ImageLoader ,從前但部份也是用github上某個大大的Library 吧,今次試試使用volley實作。
首先,Volley 已經有很完善的Http Request 的流程,也有一推Caching Helper。
要做一個類ImageLoader Library ,Volley內已經有以下元件:
- ImageLoader ( com.android.volley.toolbox.ImageLoader)
- RequestQueue
- ImageCache
實戰過程中,沒有像Youtube Google 神使用得那麼簡單。Youtube 內有BitmapLruCache,但是原來它的tool內沒有包括在內,需要用家親自處理。ImageLoader 內需要的是一個RequestQueue 處理Request ,及一個ImageCache。
/**
* Constructs a new ImageLoader.
* @param queue The RequestQueue to use for making image requests.
* @param imageCache The cache to use as an L1 cache.
*/
public ImageLoader(RequestQueue queue, ImageCache imageCache) {
mRequestQueue = queue;
mCache = imageCache;
}
本人做了一個類BitmapLruCache的Class
/***
* Helper Class for Volley ImageLoader Bitmap ImageCache, since it need LruCache
* Memory Cache Class
* @author 阿目
*
*/
class VolleyBitmapLruCache extends LruCache<String, Bitmap> implements ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public VolleyBitmapLruCache(Context context) {
this(context , getDefaultLruCacheSize());
}
public VolleyBitmapLruCache(Context context , int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
另外為了方便自己使用整個流程,也起了一個Class 為VolleyImageLoaderHelper,如下:
/***
* VolleyImageLoaderHelper Class for Volley ImageLoader
* Memory Cache Class
* @author 阿目
*
*/
public class VolleyImageLoaderHelper {
// ImageLoader From Volley
private static ImageLoader sImageLoader;
/**
*
* @return Volley ImageLoader
*/
public static ImageLoader get() {
return sImageLoader;
}
public static void initImageLoader(Context context) {
if (sImageLoader != null) {
return;
}
sImageLoader = new ImageLoader(
Volley.newRequestQueue(context), // Volley Request
new VolleyBitmapLruCache(context) // Volley BitmapLruCacheHepler
);
}
}
第一次使用時,在e.g. MainActivity 下啟動VolleyImageLoaderHelper
VolleyImageLoaderHelper.initImageLoader(getApplicationContext()); // init VolleyImageLoaderHelper
VolleyImageLoaderHelper.get().get(url, new ImageListener() {
@Override
public void onErrorResponse(VolleyError error) {
img.setImageResource(R.drawable.ic_launcher);
}
@Override
public void onResponse(final ImageContainer response, boolean isImmediate) {
// response.getBitmap(); // 這個就是最後得來的Bitmap
}
}
這使得成個流程也非常簡單。
以下是 上面的簡單例子:github.com/extralam/VolleyImageHelper
*有沒有發現像流了一點東西呢?其實這個實作不是完全品,這個helper 是沒有做fileCache ,在Volley 內有DiskBasedCache可以幫助你完成這工作。
除此以外,Volley Library 已經有一個NetworkImageView 的widget 幫手處理Image 。