zoukankan      html  css  js  c++  java
  • 【ListViewJSON】【com.demo.app.common】【BitmapManager】源码分析及其在工程中作用

    首先源码如下:

    package com.demo.app.common;
    
    import java.io.File;
    import java.io.IOException;
    import java.lang.ref.SoftReference;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.WeakHashMap;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    import android.graphics.Bitmap;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.ImageView;
    
    import com.demo.app.AppException;
    import com.demo.app.api.ApiClient;
    /**
     * 异步线程加载图片工具类
     * 使用说明:
     * BitmapManager bmpManager;
     * bmpManager = new BitmapManager(BitmapFactory.decodeResource(context.getResources(), R.drawable.loading));
     * bmpManager.loadBitmap(imageURL, imageView);
     * @author liux (http://my.oschina.net/liux)
     * @version 1.0
     * @created 2012-6-25
     */
    public class BitmapManager {  
          
        private static HashMap<String, SoftReference<Bitmap>> cache;  
        private static ExecutorService pool;  
        private static Map<ImageView, String> imageViews;  
        private Bitmap defaultBmp;  
        
        static {  
            cache = new HashMap<String, SoftReference<Bitmap>>();  
            pool = Executors.newFixedThreadPool(5);  //固定线程池
            imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
        }  
        
        public BitmapManager(){}
        
        public BitmapManager(Bitmap def) {
            this.defaultBmp = def;
        }
        
        /**
         * 设置默认图片
         * @param bmp
         */
        public void setDefaultBmp(Bitmap bmp) {  
            defaultBmp = bmp;  
        }   
      
        /**
         * 加载图片
         * @param url
         * @param imageView
         */
        public void loadBitmap(String url, ImageView imageView) {  
            loadBitmap(url, imageView, this.defaultBmp, 0, 0);
        }
        
        /**
         * 加载图片-可设置加载失败后显示的默认图片
         * @param url
         * @param imageView
         * @param defaultBmp
         */
        public void loadBitmap(String url, ImageView imageView, Bitmap defaultBmp) {  
            loadBitmap(url, imageView, defaultBmp, 0, 0);
        }
        
        /**
         * 加载图片-可指定显示图片的高宽
         * @param url
         * @param imageView
         * @param width
         * @param height
         */
        public void loadBitmap(String url, ImageView imageView, Bitmap defaultBmp, int width, int height) {  
            imageViews.put(imageView, url);  
            Bitmap bitmap = getBitmapFromCache(url);  
       
            if (bitmap != null) {  
                //显示缓存图片
                imageView.setImageBitmap(bitmap);  
            } else {  
                //加载SD卡中的图片缓存
                String filename = FileUtils.getFileName(url);
                String filepath = imageView.getContext().getFilesDir() + File.separator + filename;
                File file = new File(filepath);
                if(file.exists()){
                    //显示SD卡中的图片缓存
                    Bitmap bmp = ImageUtils.getBitmap(imageView.getContext(), filename);
                    imageView.setImageBitmap(bmp);
                }else{
                    //线程加载网络图片
                    imageView.setImageBitmap(defaultBmp);
                    queueJob(url, imageView, width, height);
                }
            }  
        }  
      
        /**
         * 从缓存中获取图片
         * @param url
         */
        public Bitmap getBitmapFromCache(String url) {  
            Bitmap bitmap = null;
            if (cache.containsKey(url)) {  
                bitmap = cache.get(url).get();  
            }  
            return bitmap;  
        }  
        
        /**
         * 从网络中加载图片
         * @param url
         * @param imageView
         * @param width
         * @param height
         */
        public void queueJob(final String url, final ImageView imageView, final int width, final int height) {  
            /* Create handler in UI thread. */  
            final Handler handler = new Handler() {  
                public void handleMessage(Message msg) {  
                    String tag = imageViews.get(imageView);  
                    if (tag != null && tag.equals(url)) {  
                        if (msg.obj != null) {  
                            imageView.setImageBitmap((Bitmap) msg.obj);  
                            try {
                                //向SD卡中写入图片缓存
                                ImageUtils.saveImage(imageView.getContext(), FileUtils.getFileName(url), (Bitmap) msg.obj);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        } 
                    }  
                }  
            };  
      
            pool.execute(new Runnable() {   
                public void run() {  
                    Message message = Message.obtain();  
                    message.obj = downloadBitmap(url, width, height);  
                    handler.sendMessage(message);  
                }  
            });  
        } 
      
        /**
         * 下载图片-可指定显示图片的高宽
         * @param url
         * @param width
         * @param height
         */
        private Bitmap downloadBitmap(String url, int width, int height) {   
            Bitmap bitmap = null;
            try {
                //http加载图片
                bitmap = ApiClient.getNetBitmap(url);
                if(width > 0 && height > 0) {
                    //指定显示图片的高宽
                    bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
                } 
                //放入缓存
                cache.put(url, new SoftReference<Bitmap>(bitmap));
            } catch (AppException e) {
                e.printStackTrace();
            }
            return bitmap;  
        }  
    }
  • 相关阅读:
    区块链中的随机数 nonce
    SaaS(软件即服务)、PaaS(平台即服务)、IaaS(基础架构即服务)、BaaS(区块链即服务)
    程序插桩简介
    侧链技术
    闪电/雷电网络
    Ubuntu16.04安装/升级openssl到1.1版本
    Ubuntu16.04升级Python3及其pip3并切换为默认版本
    Python——/usr/bin/env: ‘python(3) ’: No such file or directory
    TCP通信功能 (agent功能)
    gin框架web操作数据库
  • 原文地址:https://www.cnblogs.com/hikigaya-yukino/p/4171386.html
Copyright © 2011-2022 走看看