• android 图片缓存


    图片缓存的主要三步骤:

    一、从缓存中获取图片

    二、如果缓存中未获取图片,则从存储卡中获取

    三、如果存储卡中未获取图片,则从网络中获取

    public class ImageCache{
    
        private static final String TAG = "ImageCache";
    private ExecutorService mThreadPool;
    //写个单例模式 private static ImagCache mInstance; public synchronized static ImageCache getInstance(){ if(mInstance == null) mInstance = new ImageCache; return mInstance; } private Image(){ int maxSize = (int)(Runtime.getRuntime().maxMemory()/8); mLruCache = new LruCache<String, Bitmap>(maxSize){ @Override protected int sizeOf(String key, Bitmap value) { if(value !=null){ return value.getRowBytes()*value.getHeight(); } return 0; } };
    mThreadPool = Executors.newFixedThreadPool(5);
    }
    //获取图片格式 private String getImagrType(String url){ String[] split = url.split("\."); return split[split.length-1]; } //从缓存中获取图片 private Bitmap getBitmapFromCache(String url){ android.util.Log.d(TAG, "load from cache....."); return mLruCache.get(url); } //从磁盘中获取图片 private Bitmap getBitmapFromDisk(String url){ android.util.Log.d(TAG, "load from disk...."); return BitmapFactory.decodeFile(getCacheDir()+url); } //将图片加入缓存 private void addToLru(final String url,Bitmap bitmap){ if( getBitmapFromCache(url) != null) return ; android.util.Log.d(TAG, "add to Lru..."); mLruCache.put(url, bitmap); } //将图片写入磁盘 private void addToDisk(String url,Bitmap bitmap,String type) throws IOException{ if(getBitmapFromDisk(url) != null) return; android.util.Log.d(TAG, "add to disk....."); FileOutputStream stream = new FileOutputStream(getCacheDir()+url); if(type.equalsIgnoreCase("png")){ bitmap.compress(CompressFormat.PNG, 100, stream); }else{ bitmap.compress(CompressFormat.JPEG, 100, stream); } stream.close(); addToLru(url, bitmap); } //获取磁盘缓存路径 private static String getCacheDir(){ String dir = null; if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ dir = Environment.getExternalStorageDirectory()+File.separator+"Matrial"+File.separator +"image"+File.separator; }else{ dir = App.context.getCacheDir()+File.separator+"image"+File.separator; } return mkdir(dir); } private static String mkdir(String dir){ File file =new File(dir); if(!file.exists()){ file.mkdirs(); } return dir; }
    //网络下载图片

    public void load(final String url, final OnImageLoadedListener l) {
    final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case Constants.SUCCESS:
    if(l != null) l.onImage((Bitmap) msg.obj);
    break;
    case Constants.FAILED:
    if(l != null) l.onImage(null);
    break;
    }
    }
    };


    final String key = Encrypt.md5(url);
    Bitmap bmp = loadByLru(key);

    if(bmp != null) {
    handler.obtainMessage(Constants.SUCCESS, bmp).sendToTarget();
    return;
    }

    bmp = loadByDisk(key);
    if(bmp != null) {
    handler.obtainMessage(Constants.SUCCESS, bmp).sendToTarget();
    return;
    }

    mThreadPool.execute(new Runnable() {
    @Override
    public void run() {
    DefaultHttpClient client = null;
    try {
    System.out.println("get by network.........................................");
    client = new DefaultHttpClient();
    HttpGet get = new HttpGet(url);
    HttpResponse response = client.execute(get);
    if(response.getStatusLine().getStatusCode() == 200) {
    InputStream stream = response.getEntity().getContent();
    Bitmap b = BitmapFactory.decodeStream(stream);
    stream.close();
    addToDisk(key, b, getImageType(url));
    handler.obtainMessage(Constants.SUCCESS, b).sendToTarget();
    return;
    }

    throw new Exception();
    } catch (Exception e) {
    } finally {
    if(client != null) client.getConnectionManager().shutdown();
    }
    }
    });
    }

    
      
    

    //接口回调

        public interface OnImageLoadedListener {
           public void onImage(Bitmap bmp);
       }

    
    
    }
  • 相关阅读:
    关于多个EditText的OnTextChange事件陷入死循环的处理
    #define #include #undef的其中一个用法(目的)
    串行移位锁存并行输出可级联器件74HC595
    STM32F10xx CAN BUS相关库文件"stm32f10x_can.c"内的库函数解析
    STM32 之 NVIC(中断向量、优先级) 简述
    STM32F103xx bxCAN(Basic Extended CAN) 滤波机制
    VS上利用C#实现一个简单的串口程序记录
    如何去各型MCU的官网上下载正确的数据手册
    Cotex-M3内核STM32F10XX系列时钟及其配置方法
    Stm32 debug停留在"BKPT 0xAB"或者"SWI 0xAB"的解决办法。
  • 原文地址:https://www.cnblogs.com/wei1228565493/p/4424230.html
Copyright © 2020-2023  润新知