[置顶] Volley进行图片加载和图片缓存

在开发中我们经常遇到需要对图片进行加载和缓存的情况,Volley框架为我们提供多种图片加载的方法,我们可以根据项目的需求选择响应的方法,解决图片加载、图片缓存会变得非常简单。下面我将介绍Volley框架进行图片加载和图片缓存的使用步骤:

1、实现ImageCache

package com.example.test;

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

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

/***********************************************
 ** 创建人:黎荣恒
 ** 日 期 : 2015年12月1日 上午9:44:43
 ** 描述 : 图片缓存
 ** 
 ** 版 本 : 1.0 修改人: 日 期 : 修改记录:
 ************************************************/
public class BitmapCache implements ImageCache
{
	public LruCache<String, Bitmap> cache;
	public int max = 10 * 1024 * 1024;//规定最大缓存为10兆,如果超过了10兆自动回收
	
	public BitmapCache()
	{
		cache = 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 cache.get(url);
	}

	@Override
	public void putBitmap(String url, Bitmap bitmap)
	{
		cache.put(url, bitmap);
	}
}

2、布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
     >
    
    <ImageView 
        android:id="@+id/iv_img1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"/>
    
    <ImageView 
        android:id="@+id/iv_img2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"/>
    
    <com.android.volley.toolbox.NetworkImageView 
        android:id="@+id/networkImageView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginTop="30dp"/>

</LinearLayout>

3、下面就是加载图片的三种方式,其中前面的一种方法不进行图片缓存,后面两种加载方法会进行图片的缓存,直接上代码

package com.example.test;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.Toast;

import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.NetworkImageView;

/***********************************************
 ** 创建人: 黎荣恒 
 ** 日 期 : 2015年11月30日 下午6:32:08
 ** 描述 : Volley加载图片
 ** 
 ** 版 本 : 1.0 修改人: 日 期 : 修改记录:
 ************************************************/
public class LoadImageActivity extends Activity
{
	private ImageView imageView1,imageView2;
	private NetworkImageView mNetworkImageView;
	String url = "http://www.logoing.net/wp-content/uploads/2012/08/baidulogo1.jpg";
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.loadimage_activity);
		imageView1 = (ImageView) findViewById(R.id.iv_img1);
		imageView2 = (ImageView) findViewById(R.id.iv_img2);
		mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
		loadImage();
		cacheImage();
		networkImageViewLoad();
	}

	/**
	 * 使用ImageRequest进行图片加载,不进行缓存
	 */
	private void loadImage()
	{
		/**
		 * 图片请求对象
		 * 第一个参数:请求接口
		 * 第二个参数:请求成功监听
		 * 第三个参数:请求到的图片最大的宽度    如果是0表示图片默认大小
		 * 第四个参数:请求到的图片最大的高度    如果是0表示图片默认大小
		 * 第五个参数:图片格式
		 * 第六个参数:请求失败监听
		 */
		ImageRequest imageRequest = new ImageRequest(url, new Listener<Bitmap>() {

			@Override
			public void onResponse(Bitmap response)
			{
				imageView1.setImageBitmap(response);
			}
		}, 0, 0, Config.RGB_565, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError error)
			{
				Toast.makeText(LoadImageActivity.this, "图片请求失败", Toast.LENGTH_LONG).show();
			}
		});
		//添加任务到请求队列
		VolleySingleton.getVolleySingleton(getApplicationContext()).addToRequestQueue(imageRequest);
	}
	
	/**
	 * ImageLoader加载图片并进行缓存
	 */
	private void cacheImage()
	{
		ImageLoader loader = new ImageLoader(VolleySingleton
				.getVolleySingleton(getApplicationContext()).getRequestQueue(),
				new BitmapCache());
		/**
		 * 第一个参数:图片加载完成用于先是图片的控件 第二个参数:默认图片 第三个参数:加载出错显示的图片
		 */
		ImageListener listener = ImageLoader.getImageListener(imageView2,
				R.drawable.ic_launcher, R.drawable.ic_launcher);
		loader.get(url, listener);// 加载的图片不进行压缩
		// loader.get(requestUrl, imageListener, maxWidth,maxHeight);//进行压缩,规定图片的最大宽高
	}

	/**
	 * 使用ImageLoader和NetworkImageView的结合进行图片的加载和缓存
	 */
	private void networkImageViewLoad()
	{
		ImageLoader loader = new ImageLoader(VolleySingleton
				.getVolleySingleton(getApplicationContext()).getRequestQueue(),
				new BitmapCache());
		//设置显示的默认图片
		mNetworkImageView.setDefaultImageResId(R.drawable.ic_launcher);
		//加载出错显示的图片
		mNetworkImageView.setErrorImageResId(R.drawable.ic_launcher);
		mNetworkImageView.setImageUrl(url, loader);
	}

}

[置顶] Volley进行图片加载和图片缓存_第1张图片

项目源码下载地址:http://download.csdn.net/detail/u013043346/9315759

你可能感兴趣的:(图片缓存)