2.
//4
//6
package com.imageloader;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 类描述:本地
* DisLruCache
* 创建人:yekh
* 创建时间:2017/5/23 9:14
*/
public class ImageByIO {
public Bitmap readBitMapByMd5Url(String url, ImageView imageView){
Context context=imageView.getContext();
File root = context.getExternalCacheDir();
String md5 = MD5.encryptByMD5(url);
File file =new File(root,md5+".png");
if(!file.exists())
return null;
try {
FileInputStream fis =new FileInputStream(file);
Bitmap bitmap = BitmapFactory.decodeStream(fis);
fis.close();
return bitmap;
} catch (IOException e) {
return null;
}
}
public static void writeBitMap(String url, ImageView imageView,Bitmap bitmap){
Context context=imageView.getContext();
File root = context.getExternalCacheDir();
String md5 = MD5.encryptByMD5(url);
File file=new File(root,md5+".png");
try {
FileOutputStream fos=new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//3
package com.imageloader;
import android.graphics.Bitmap;
import android.util.LruCache;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 类描述:内存
* LruCache
* 创建人:yekh
* 创建时间:2017/5/23 9:14
*/
public class ImageByRom {
private static Map<String,Bitmap> map=new HashMap<>();
private static List<String> list=new ArrayList<>();
private static int maxSize= 1024*1024*30;
private static int size;
public Bitmap readBitMapByUrl(String url){
return map.get(url);
}
public static void putBitMapByUrl(String url,Bitmap bitmap){
int bitmapSize = bitmap.getRowBytes()*bitmap.getHeight();
if(bitmapSize>maxSize)
return;
if(bitmapSize+size<maxSize){
map.put(url,bitmap);
list.add(url);
}else {
if(list.size()>0){
String urlkey = list.remove(0);
Bitmap bitmapUrlKey = map.remove(urlkey);
size=size-bitmapUrlKey.getHeight()*bitmapUrlKey.getRowBytes();
putBitMapByUrl(url,bitmap);
}
}
}
private final int max = (int)Runtime.getRuntime().maxMemory()/8;
private LruCache<String ,Bitmap> mLruCache= new LruCache<String,Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes()*bitmap.getHeight();
}
};
public void add(String url,Bitmap bitmap){
mLruCache.put(url,bitmap);
}
public Bitmap get(String url){
return mLruCache.get(url);
}
}
//4
package com.imageloader;
import android.graphics.Bitmap;
import android.util.Log;
import android.widget.ImageView;
/**
* 类描述:
* 创建人:yekh
* 创建时间:2017/5/23 9:15
*/
public class ImageLoader {
private ImageByRom rom;
private ImageByIO io;
private ImageNetUtils net;
public ImageLoader(){
rom=new ImageByRom();
io=new ImageByIO();
net=new ImageNetUtils();
}
public void display(String imageUrl, ImageView imageView){
Bitmap bitmap = rom.readBitMapByUrl(imageUrl);
//内存检查
if(bitmap!=null){
Log.e("display", "display---》"+imageUrl+"从内存读取");
}else {
//本地里面没有
bitmap=io.readBitMapByMd5Url(imageUrl,imageView);
//本地检查
if(bitmap!=null){
Log.e("display", "display---》"+imageUrl+"从本地读取");
imageView.setImageBitmap(bitmap);
rom.putBitMapByUrl(imageUrl,bitmap);
}else{
Log.e("display", "display---》"+imageUrl+"从网络读取");
net.loadImage(imageUrl,imageView);
}
}
}
}
/5/
package com.imageloader;
import android.graphics.Bitmap;
import android.util.Log;
import android.widget.ImageView;
import com.example.wz.cachedemo.R;
import java.util.Vector;
/**
* 类描述:通过网络下载图片
* 创建人:yekh
* 创建时间:2017/5/19 18:57
*/
public class ImageNetUtils {
//最大10个 10个窗口
private Vector<Thread> listThread;
//排号系统 后进先出
private Vector<ImageReuqet> list;
private int size = 10;
private int sizeThread = 10;
public ImageNetUtils() {
listThread=new Vector<>(sizeThread);
list=new Vector<>(size);
}
private void add(String imageUrl,ImageView imageView){
ImageReuqet reuqest=new ImageReuqet(imageUrl,imageView);
if(list.size()>=size){
list.remove(0);
}
list.add(reuqest);
if(listThread.size()<sizeThread){
ImageReuqet reuqet=list.remove(list.size()-1);
DownloadImage downloadImage=new DownloadImage(reuqet);
listThread.add(downloadImage);
downloadImage.start();
}
}
private void remove(Thread thread){
listThread.remove(thread);
if(list.size()>0){
ImageReuqet reuqet=list.remove(list.size()-1);
DownloadImage downloadImage=new DownloadImage(reuqet);
listThread.add(downloadImage);
downloadImage.start();
}else{
Log.e("remove", "remove----------等待队列为空");
}
}
public void loadImage(String imageUrl, ImageView imageView){
imageView.setImageResource(R.mipmap.ic_launcher);
imageView.setTag(imageUrl);
add(imageUrl,imageView);
}
class DownloadImage extends Thread{
private String imageUrl;
private ImageView imageView;
public DownloadImage(ImageReuqet reuqet) {
imageUrl=reuqet.imageUrl;
imageView=reuqet.imageView;
}
@Override
public void run() {
final Bitmap bitmap= HttpUrlUtils.loadImage2Bitmap(imageUrl);
if(bitmap!=null){
String tag =imageView.getTag().toString();
if(imageUrl.equals(tag)){
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
ImageByIO.writeBitMap(imageUrl,imageView,bitmap);
ImageByRom.putBitMapByUrl(imageUrl,bitmap);
}
Log.e("DownloadImage", "DownloadImage----------"+imageUrl+"任务完成");
remove(DownloadImage.this);
}
}
}
}
//6
package com.imageloader;
import android.widget.ImageView;
/**
* 类描述:
* 创建人:yekh
* 创建时间:2017/5/19 19:35
*/
public class ImageReuqet {
public ImageReuqet(String imageUrl, ImageView imageView) {
this.imageUrl = imageUrl;
this.imageView = imageView;
}
String imageUrl;
ImageView imageView;
}
package com.imageloader;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 类描述:
* 创建人:yekh
* 创建时间:2017/5/18 15:28
*/
public class MD5 {
private static final String MD5_SUFFIX = "_dengsilinming";
/**
* 字符加密
*
* @param str 明文
* @return 返回加了后缀的加密字符
*/
public static String encryptByMD5(String str) {
try {
if (str == null || str.length() < 1 || "0".equals(str))
str = "0";
String tmp = md5(str + MD5_SUFFIX, "UTF-8");
if (null != tmp) {
return replace(tmp, ":", "", -1).toLowerCase();
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
/**
* md5加密方法,不可逆转
*
* @param str 明文
* @param charset 字符编码
* @return
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
*/
public static String md5(String str, String charset)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
byte[] tmpInput = null;
if (null != str) {
if (null != charset) {
tmpInput = str.getBytes(charset);
} else {
tmpInput = str.getBytes();
}
} else {
return null;
}
MessageDigest alg = MessageDigest.getInstance("MD5"); // or "SHA-1"
alg.update(tmpInput);
return byte1hex(alg.digest());
}
/**
* 字节码转换成16进制字符串
*
* @param inputByte
* @return
*/
public static String byte1hex(byte[] inputByte) {
if (null == inputByte) {
return null;
}
String resultStr = "";
String tmpStr = "";
for (int n = 0; n < inputByte.length; n++) {
tmpStr = (Integer.toHexString(inputByte[n] & 0XFF));
if (tmpStr.length() == 1)
resultStr = resultStr + "0" + tmpStr;
else
resultStr = resultStr + tmpStr;
if (n < inputByte.length - 1)
resultStr = resultStr + ":";
}
return resultStr.toUpperCase();
}
public static String replace(String text, String repl, String with, int max) {
if (isEmpty(text) || isEmpty(repl) || with == null || max == 0) {
return text;
}
int start = 0;
int end = text.indexOf(repl, start);
if (end == -1) {
return text;
}
int replLength = repl.length();
int increase = with.length() - replLength;
increase = (increase < 0 ? 0 : increase);
increase *= (max < 0 ? 16 : (max > 64 ? 64 : max));
StringBuffer buf = new StringBuffer(text.length() + increase);
while (end != -1) {
buf.append(text.substring(start, end)).append(with);
start = end + replLength;
if (--max == 0) {
break;
}
end = text.indexOf(repl, start);
}
buf.append(text.substring(start));
return buf.toString();
}
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
}