用简单的代码逻辑实现三级缓存图片

2.
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;
}


//7


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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值