图片加载+本地缓冲
来源:互联网 发布:金蝶软件苏州 编辑:程序博客网 时间:2024/05/14 11:29
本文参考自:http://blog.csdn.net/onerain88/article/details/7008409(纠正了原文的小小疏漏和累赘代码)-----大神路过,欢迎指教。
package com.example.net;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import android.widget.Toast;
public class loadImage {
/*
* 引用内存缓存
*/
public static HashMap<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
// public static HashMap<String, SoftReference<Bitmap>> imageCache = new
// HashMap<String, SoftReference<Bitmap>>();
private final static String CACHE_PATH = Environment
.getExternalStorageDirectory().getPath() + "/AsyncLoad";
public loadImage() {
System.out.println("path-->" + CACHE_PATH);
}
@SuppressLint("HandlerLeak")
public void loadBitmap(Context context, final ImageView imgView,
final String imgUrl, final ImageCallBack imageCallBack) {
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:// 成功
imageCallBack.onSuccess(imgView, (Bitmap) msg.obj);
break;
case 1:
imageCallBack.onFailed(imgView);
break;
default:
break;
}
};
};
// 先去内存的缓冲区寻找
if (imageCache.containsKey(imgUrl)) {
SoftReference<Bitmap> reference = imageCache.get(imgUrl);
Bitmap bitmap = reference.get();
if (null != bitmap) {
Toast.makeText(context, "在 内存 缓存 中找到了~~~~~", 1000).show();
imageCallBack.onSuccess(imgView, bitmap);
return;
}
}
// 再去本地缓存中寻找
String name1 = imgUrl.substring(imgUrl.lastIndexOf("/") + 1);// 截取后面的一段
File cakeDir = new File(CACHE_PATH);
File[] imgs = cakeDir.listFiles();
if (imgs != null) {// 便利查找
int i = 0;
for (; i < imgs.length; i++) {
if (name1.equals(imgs[i].getName()))
break;
}
if (i < imgs.length) {
Toast.makeText(context, "在本地缓存中找到了~~~~~~~", 1000).show();
Bitmap bitmap = BitmapFactory.decodeFile(CACHE_PATH + "/"
+ name1);
imageCallBack.onSuccess(imgView, bitmap);
return;
}
}// end if
// 都 没找到。新启动线程进行下载
new Thread() {
public void run() {
Bitmap bitmap = null;
System.out.println("新启动线程!!!!!!!!!!!!!!!!!!!");
// **********************************
try {
URL url;
url = new URL(imgUrl);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream bitmapIn = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(bitmapIn);
bitmapIn.close();
// 添加内存缓冲区的“软引用”
imageCache.put(imgUrl, new SoftReference<Bitmap>(bitmap));
Message msg = Message.obtain();
msg.obj = bitmap;
msg.what = 0;
handler.sendMessage(msg);
} catch (Exception e) {
Message msg = Message.obtain();
msg.what = 1;
handler.sendMessage(msg);
}// end try catch()
if (bitmap != null) {// 将图片缓存到本地
// 展示略去××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
// * 将图片保存到本地缓存
// */
File dir = new File(CACHE_PATH);
if (!dir.exists()) {
dir.mkdirs();
}
File bitmapFile = new File(CACHE_PATH + "/"
+ imgUrl.substring(imgUrl.lastIndexOf("/") + 1));
if (!bitmapFile.exists()) {
try {
bitmapFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos;
try {
fos = new FileOutputStream(bitmapFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// *******************************
System.out.println("run方法 结束了~~~~~~~~~~~~~~~~·");
};
}.start();
}
public interface ImageCallBack {
// 图片加载结束的回调方法
public void onSuccess(ImageView img, Bitmap bm);
public void onFailed(ImageView img);
}
}
//代码中的用法
ImageView img = (ImageView) view.findViewById(R.id.img_bitmap);
loadImage imager = new loadImage();
imager.loadBitmap(context,img, (String) getItem(position), new ImageCallBack() {
@Override
public void onSuccess(ImageView img, Bitmap bm) {
// TODO Auto-generated method stub
img.setImageBitmap(bm);
}
@Override
public void onFailed(ImageView img) {
// TODO Auto-generated method stub
img.setImageResource(R.drawable.ic_launcher);
}
});
- 图片加载+本地缓冲
- android加载本地图片
- ActionScript3 加载本地图片
- 异步加载本地 图片
- ActionScript3 加载本地图片
- ImageLoader 加载本地图片
- WinForm 加载本地图片
- Fresco 加载本地图片
- imageloader加载本地图片
- 本地图片加载
- imageLoader加载本地图片
- ImageLoader加载本地图片
- fresco加载本地图片
- UIWebView加载本地图片
- Glide-加载本地图片
- ImageLoader加载本地图片
- ImageLoader加载本地图片
- ImageLoader 加载本地图片
- 统计次数问题
- 【高精度计算 02】 大整数乘法
- CentOS更改yum源
- 在使用代码布局的时候几个技巧,可减少 算坐标的麻烦!!
- 35个Java代码性能优化总结
- 图片加载+本地缓冲
- java中的流介绍
- 8600手机
- 欢迎使用CSDN-markdown编辑器
- Activity和Fragment transition介绍
- 黑马程序员----反射学习笔记
- 死锁 http://blog.csdn.net/orange_os/article/details/7417204
- All in All
- 【高精度计算 03】 大小数加法