关于Volley中的ImageLoader加载图片

Android 码拜 6年前 (2015-05-10) 424次浏览 0个评论

ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
    ImageListener listener = ImageLoader.getImageListener(imageView,R.drawable.default_image, R.drawable.default_image);
    imageLoader.get(strUrl, listener);
这个是将网络上下载的图片设置到imageView中。那如何获得下载好的这个Bitmap,求指教

20分
推荐缓存,用流转换。
用流  byte数组   怎么都可以很多方式的
额粘贴太长不会被喷吧 我给你详细的吧。
这个是图片
package com.zxsc.cook_dishes_cy.framework.utils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Environment;
import android.util.Log;

/**
 * 操作Bitmap的工具类
 * 保存Bitmap至Sd卡,从Sd卡获取Bitmap,根据url判断Sd卡中是否存在对应的Bitmap
 * 
 * @author Ligang
 *
 */
public class BitmapUtil {
//图片保存路径
public static final String CACHES_PATH = Environment.getExternalStorageDirectory().toString() +
File.separator +”xuezuocai” + File.separator + “cache” + File.separator + “img” + File.separator;
//图片保存的品质,100为保存原始图片不压缩
public static final int QUALITY = 100; 
//图片保存的后缀名—如”.jpg”,”.png”,”.xx”这个可以随便定义,设置为””也可以
public static final String EXTENSION_NAME = “.jpg”;
static File fileDir = new File(CACHES_PATH);
/**
 * 创建缓存图片文件夹
 */
public static void createCacheDir() {
if(!fileDir.exists()){
fileDir.mkdirs();
}

public static void saveBitmap(InputStream is,String imgUrl){
createCacheDir();
File dstFile = new File(fileDir, getFileName(imgUrl));
try {
if(!dstFile.exists()){
dstFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(dstFile);
byte[] buff = new byte[1024 * 10];
int len;
while((len = is.read(buff)) != -1){
fos.write(buff,0,len);
}
is.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}
/**
 * 将Bitmap保存到Sd卡
 * @param bitmap
 * @param imgUrl
 */
public static void saveBitmap(Bitmap bitmap,String imgUrl){
File file  =new File(fileDir, getFileName(imgUrl));
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
//保存bitmap
bitmap.compress(CompressFormat.JPEG, QUALITY, fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
 * 获取图片文件名
 * @param imgUrl
 * @return
 */
public static String getFileName(String imgUrl){
return MD5(imgUrl) + EXTENSION_NAME;
}
/**
 * 根据url判断Sd卡中是否存在对应的Bitmap
 * @param imgUrl
 * @return
 */
public static boolean bitmapExists(String imgUrl){
File file = new File(CACHES_PATH + MD5(imgUrl) + EXTENSION_NAME);
return file.exists();

}
public static void createFile(File file){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
public static File getFile(String imgUrl){
File file = new File(CACHES_PATH + MD5(imgUrl) + EXTENSION_NAME);
return file;
}

/**
 * 获取一张压缩的Bitmap
 * @param imgUrl
 * @param width
 * @param height
 * @return
 */
public static Bitmap getBitmap(String imgUrl,int width,int height){
Options options = new Options();
//将options的inJustDecodeBounds设置为true的话,加载Bitmap时,不会加入内存,此时获取到的Bitmap是null
//但是 可以获取到bitmap的宽高信息
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(CACHES_PATH + getFileName(imgUrl), options);
int bitmapWidth = options.outWidth;
log(“原始Bitmap的宽=”+bitmapWidth);

int inSampleSize = 1; //缩放比例  如果等于4,那么宽和高都变为 1/4
if(bitmapWidth > width){
inSampleSize = bitmapWidth/width;
}

options.inSampleSize = inSampleSize;
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(CACHES_PATH + getFileName(imgUrl), options);
}

public static Bitmap getBitmapFromSDCard(String imageUrl){
return BitmapFactory.decodeFile(getFile(imageUrl).getPath());

}
/**
 * MD5加密算法
 * 在这里主要是为了格式化保存的图片的文件名(将Http://………jpg 转化成不含特殊字符的文件名)
 * 加密后得到的文件名是唯一的
 * @param s
 * @return
 */
public static String MD5(String s) {
try {
byte[] btInput = s.getBytes();
MessageDigest mdInst = MessageDigest.getInstance(“MD5”);
mdInst.update(btInput);
byte[] md = mdInst.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < md.length; i++) {
int val = ((int) md[i]) & 0xff;
if (val < 16)
sb.append(“0”);
sb.append(Integer.toHexString(val));
}
return sb.toString();
} catch (Exception e) {
return null;
}
}
/**
 * 清空本地图片缓存
 */
public static void clearImageCache(){
File fileDir = new File(CACHES_PATH);
File[] files = fileDir.listFiles();
for (File file : files) {
file.delete();
}
}

public static  void log(Object o){
Log.d(BitmapUtil.class.getName(), “”+o);
}
}

IMAGEloader
package com.zxsc.cook_dishes_cy.framework.utils;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Build;
import android.util.Log;
import android.util.LruCache;
import android.widget.ImageView;
@SuppressLint(“NewApi”)
public class ImageLoader {

/**线程池**/
private ExecutorService mExecutorService;
/**用于缓存图片**/
private LruCache<String, Bitmap> mLrcCache;
public ImageLoader() {
mExecutorService = Executors.newFixedThreadPool(3);
// mLrcCache = new LruCache<String, Bitmap>(maxSize);
initLrcCache();
}

private boolean mIsBusy = false;
public void setmIsBusy(boolean mIsBusy) {
this.mIsBusy = mIsBusy;
}

private void initLrcCache() {
//获取系统分配给每个应用程序的最大内存,每个应用系统分配64M
int maxMemory = (int) Runtime.getRuntime().maxMemory();  
log(“maxMemory=”+maxMemory);
// int mCacheSize = maxMemory / 8;
int mCacheSize = 5000 * 1024;
mLrcCache = new LruCache<String, Bitmap>(mCacheSize){

@Override
protected int sizeOf(String key, Bitmap value) {
int size = 0;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1){
size = value.getByteCount();
//3.1版本之后,使用的是这个方法获取bitmap的内存大小
log(“size = ” + size);
return size;
}
//3.1版本之前,使用的是这个方法获取bitmap的内存大小
size = value.getRowBytes() * value.getHeight();
log(“size = ” + size);
return size;
}
};
}

public void displayImg(String imgUrl,ImageView imageView){

imageView.setTag(imgUrl);
log(“进入 displayImg”);
//首先从lrc缓存中获取bitmap
Bitmap bitmap = getBitmapFromCache(imgUrl);
if(bitmap != null){
//直接为ImageView设置Bitmap
showBitmap(imageView, bitmap,imgUrl);
log(“来自lru缓存中”);
return;
}
log(“lru缓存中不存在bitmap,开始从本地获取”);
//向线程池提交线程任务
if(!mIsBusy){
LoadBitmapRunnable runnable = new LoadBitmapRunnable(imageView, imgUrl);
mExecutorService.submit(runnable);
log(“提交一个网络请求”);
}
}

/**
 * 加载显示bitmap的线程
 * @author Administrator
 *
 */
private class LoadBitmapRunnable implements Runnable{
private ImageView imageView;
private String imgUrl;
public LoadBitmapRunnable(ImageView imageView, String imgUrl) {
super();
this.imageView = imageView;
this.imgUrl = imgUrl;
}

@Override
public void run() {
//从本地获取Bitmap
Bitmap bitmap = getBitmapFromLocal(imgUrl);
log(“run–bitmap=”+bitmap);
if(bitmap != null){
//为ImageView显示Bitmap
showBitmap(imageView, bitmap,imgUrl);
log(“来自本地”);
return;
}
log(“本地不存在bitmap,开始从网络获取”);
//从网络获取Bitmap
bitmap = getBitmapFromNetwork(imgUrl);
if(bitmap != null){
//为ImageView显示Bitmap
showBitmap(imageView, bitmap,imgUrl);
log(“来自网络“);
}
}

}

/**
 * 为ImageView显示Bitmap
 * @param imageView
 * @param bitmap
 */
private void showBitmap(ImageView imageView,Bitmap bitmap,String imgUrl){
//防止图片错乱显示
if(!imgUrl.equals(imageView.getTag().toString())){
return;
}
DisplayImgRunnable runnable = new DisplayImgRunnable(imageView, bitmap);
Activity aty = (Activity) imageView.getContext();
aty.runOnUiThread(runnable);
}
class DisplayImgRunnable implements Runnable{
private ImageView imageView;
private Bitmap bitmap;
public DisplayImgRunnable(ImageView imageView, Bitmap bitmap) {
super();
this.imageView = imageView;
this.bitmap = bitmap;
}
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
}

/**
 * 将bitmap放入lrc缓存
 * @param bitmap
 * @param urlStr
 */
private void addBitmapToCache(Bitmap bitmap,String urlStr){
mLrcCache.put(urlStr, bitmap);
}

/**
 * 从lrc缓存中获取bitmap
 * @param imgUrl
 * @return
 */
private Bitmap getBitmapFromCache(String imgUrl){
return mLrcCache.get(imgUrl);
}

/**
 * 从本地获取Bitmap
 * @param imgUrl
 * @return
 */
public Bitmap getBitmapFromLocal(String imgUrl) {
//TODO
Bitmap bitmap = BitmapUtil.getBitmapFromSDCard(imgUrl);
if(bitmap != null){
addBitmapToCache(bitmap, imgUrl);
}
return bitmap;
}
/**
 * 从网络获取Bitmap
 * @param imgUrl
 * @return
 */
public Bitmap getBitmapFromNetwork(String imgUrl){
Bitmap bitmap = null;
try {
URL url  = new URL(imgUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(8 * 1000);
conn.setReadTimeout(8 * 1000);
InputStream is = conn.getInputStream();
//将文件保存到本地SD卡
BitmapUtil.saveBitmap(is, imgUrl);
bitmap = BitmapUtil.getBitmapFromSDCard(imgUrl);
//加入lrc缓存
addBitmapToCache(bitmap, imgUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();

return bitmap;
}

public void log(Object o){
Log.d(“ImageLoader”, o+””);
}
}

这是平时用的比较习惯的。反正异步加三部。我网络连接加图片一般加很多的时候都这样用的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于Volley中的ImageLoader加载图片
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!