Volley一些介绍就不多说了,利用Volley加载图片主要有3种方式(1)ImageRequest(2)ImageLoader(3)NetWorkImageView

这里我们主要运用的是ImageLoader

ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。图片通过一个URL和一个ImageListener实例的get()方法就可以被加载。从哪里,ImageLoader会检查ImageCache,而且如果缓存里没有图片就会从网络上获取。

Volley的ImageCache接口允许你使用你喜欢的L1缓存实现。不幸的是Volley没有提供默认的实现。在I/O的介绍中展示了BitmapLruCache的一点代码片段,但是Volley这个库本身并不包含任何相关的实现。

ImageCache接口有两个方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).这两个方法足够简单直白,他们可以添加任何的缓存实现。

主Activity中的代码

package com.hht.android_volley_imageloader;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ImageView;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

    private ImageLoader imageLoader = null;
    private RequestQueue queue = null;
    private ImageView imageView_imageloader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        // 生成请求队列
        queue = Volley.newRequestQueue(this);
        // 生成ImageLoader
        imageLoader = new ImageLoader(queue, ImagecacheManager.newInstance());
        // 从图片加载中获得图片并显示
        imageLoader.get("http://www.baidu.com/img/baidu_sylogo1.gif",
                ImageLoader.getImageListener(imageView_imageloader,
                        R.drawable.ic_launcher, R.drawable.ic_launcher));
    }

    private void initView() {
        imageView_imageloader = (ImageView) findViewById(R.id.imageView_imageloader);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

ImageCacheManager类的主要实现,该类主要 实现了ImageCache和LruCache

package com.hht.android_volley_imageloader;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class ImagecacheManager extends LruCache implements
        ImageCache {

    private static ImagecacheManager imagecacheManager = null;
    private static SoftManager softManager = null;

    public ImagecacheManager(int maxSize) {
        super(maxSize);
        // TODO Auto-generated constructor stub
    }

    // 获得强缓存实例,并初始化软缓存
    public static ImagecacheManager newInstance() {
        if (imagecacheManager == null) {
            imagecacheManager = new ImagecacheManager(4 * 1024 * 1024);
            softManager = SoftManager.newInstance();
        }
        return imagecacheManager;
    }

    @Override
    protected void entryRemoved(boolean evicted, String key, Bitmap oldValue,
            Bitmap newValue) {
        // TODO Auto-generated method stub
        if (evicted) {

            // 如果图片超过指定的强缓存的大小,将之移除存入软缓存
            softManager.putBitmap(key, oldValue);
        }
        super.entryRemoved(evicted, key, oldValue, newValue);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        // 返回存入图片的大小

        return value.getRowBytes() * value.getHeight();
    }

    @Override
    public Bitmap getBitmap(String url) {
        // 获取缓存中的图片,如果图片在强缓存没有,去软缓存中找,找到后移至强缓存中,并在软缓存中移除
        if (imagecacheManager.get(url) == null) {
            if (softManager.getBitmap(url) != null) {
                imagecacheManager.put(url, softManager.getBitmap(url));
                softManager.remove(url);
            }
        }
        return imagecacheManager.get(url);
    }

    // 向强缓存中存入图片
    @Override
    public void putBitmap(String url, Bitmap bm) {
        // TODO Auto-generated method stub
        imagecacheManager.put(url, bm);

    }

}

软缓存的实现方式

package com.hht.android_volley_imageloader;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;

import android.graphics.Bitmap;

public class SoftManager {

    private static SoftManager softManager = null;
    private Map> map = new HashMap>();

    // 获得软缓存的实例
    public static SoftManager newInstance() {

        if (softManager == null) {
            softManager = new SoftManager();
        }
        return softManager;
    }

    // 获得软缓存中的bitmap
    public Bitmap getBitmap(String url) {
        if (map.get(url) != null) {
            SoftReference reference = map.get(url);
            Bitmap bitmap = reference.get();
            return bitmap;
        }
        return null;

    }

    // 向软缓存中存入数据
    public void putBitmap(String url, Bitmap bitmap) {
        map.put(url, new SoftReference(bitmap));
    }

    // 移除软缓存的数据
    public boolean remove(String url) {
        try {
            map.remove(url);
            return true;
        } catch (Exception e) {
            // TODO: handle exception
            return false;
        }

    }
}

总结一下,在用ImageLoader加载图片时我们要实现L1缓存,这个缓存机制很大程度上能优化你的程序。