图片的三级缓存

# 第一权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
 
 
第二  MD5工具类
	
public class EncoderUtils {
   /**
    * Md5Encoder
    * 
    * @param string
    * @return
    * @throws Exception
    */
   public static String encode(String string) throws Exception {
      byte[] hash = MessageDigest.getInstance("MD5").digest(
            string.getBytes("UTF-8"));
      StringBuilder hex = new StringBuilder(hash.length * 2);
      for (byte b : hash) {
         if ((b & 0xFF) < 0x10) {
            hex.append("0");
         }
         hex.append(Integer.toHexString(b & 0xFF));
      }
      return hex.toString();
   }
}


第三  图片缓存工具类


   

public class ImagesUtils {
   Handler handler;
   private File cacheDir;
   private ExecutorService newFixedThreadPool;
   private LruCache<String, Bitmap> lruCache;
   public ImagesUtils(Context context, Handler handler) {
      //获得你手机上的最大内存
      long maxMemory = Runtime.getRuntime().maxMemory();
      
      int maxSize = (int) (maxMemory/10);
      
      this.handler = handler;

      lruCache = new LruCache<String, Bitmap>(maxSize){

         @Override
         protected int sizeOf(String key, Bitmap value) {
            return value.getRowBytes()*value.getHeight();
         }
         
      };
      //得到sd文件夹
      cacheDir = context.getCacheDir();
      //
       newFixedThreadPool = Executors.newFixedThreadPool(5);

   }
   
   
   public Bitmap getBitMap(String path){
      
      Bitmap bitmap = lruCache.get(path);
      if(bitmap!=null){
         System.out.println("我走了内存");
         return bitmap;
      }
      //从本直去取,sd卡去取bitmap
      bitmap = getBitMapFromLocal(path);
      if(bitmap!=null){
         System.out.println("我走了本地缓存");
         return bitmap;
      }
      
      // 从网络去取
      getBitmapFromNet(path);
      
      return null;
   }

   
   
   /**
    * 从网络
    * 
    * @param path
    */
   private void getBitmapFromNet(final String path) {
      newFixedThreadPool.execute(new Runnable() {

         @Override
         public void run() {

            try {
               URL url = new URL(path);
               HttpURLConnection connection = (HttpURLConnection) url
                     .openConnection();
               connection.setConnectTimeout(5000);
               connection.setReadTimeout(5000);
               int responseCode = connection.getResponseCode();
               if (responseCode == 200) {
                  InputStream inputStream = connection.getInputStream();
                  Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                  Message msg = new Message();
                  msg.what = 111;
                  msg.obj = bitmap;
                  Bundle data = new Bundle();
                  data.putString("tag", path);
                  msg.setData(data);
                  handler.sendMessage(msg);
                  //缓存到本地
                  saveBitmapToLocal(bitmap, path);
                  //缓存到内存
                  lruCache.put(path, bitmap);
               }

            } catch (Exception e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }

         }
      });

   }
   
   

   protected void saveBitmapToLocal(Bitmap bitmap, String path) {
      try {
         String encode = EncoderUtils.encode(path);

         FileOutputStream fileOutputStream = new FileOutputStream(cacheDir
               + "/" + encode);

         //图片二次裁剪
         bitmap.compress(CompressFormat.JPEG, 80, fileOutputStream);

      } catch (Exception e) {
         e.printStackTrace();
      }

   }
   
   /**
    * 从本地取   Md5   a.jpg  b.jpg
    * aafdgsgsgsggg.jpg
    * @param path
    */
   private Bitmap getBitMapFromLocal(String path) {

      try {
         String encode = EncoderUtils.encode(path);
         FileInputStream fileInputStream = new FileInputStream(cacheDir
               + "/" + encode);
         Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);
         //存到内存
         lruCache.put(path, bitmap);
         return bitmap;
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   }
   
   
  

}
 
第四 主页 Activity 
	
	
public class MainActivity extends AppCompatActivity {

    private GridView gv;
    ImagesUtils imags;
    String[] imageUrls = new String[] {
            "https://img-my.csdn.net/uploads/201407/26/1406383299_1976.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383291_6518.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383291_8239.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383290_9329.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383290_1042.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383275_3977.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383265_8550.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383264_3954.jpg",
            "https://img-my.csdn.net/uploads/201407/26/1406383264_4787.jpg",
    };


    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == 0) {
                Bitmap bitmap = (Bitmap) msg.obj;
                // 设置给imageView
                String tag = msg.getData().getString("tag");
                // 根据标记取出imageView
                ImageView imageView = (ImageView) gv.findViewWithTag(tag);
                if (imageView != null && bitmap != null) {
                    // 从网络获取图片
                    imageView.setImageBitmap(bitmap);
                    Log.i("tag", "从网络中获取图片");
                }
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imags = new ImagesUtils(this,handler);
        gv = (GridView) findViewById(R.id.gv);
        gv.setAdapter(new MyAdapter());
    }

    class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return imageUrls.length;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {


            ImageView iv = new ImageView(MainActivity.this);
            iv.setTag(imageUrls[position]);

            Bitmap bitmap = imags.getBitMap(imageUrls[position]);

            // 从内存中或者缓存中
            if (bitmap != null) {
                iv.setImageBitmap(bitmap);
            }
            // 获取图片
            return iv;
        }


    }
}
 
第五 布局
	
<GridView
    android:id="@+id/gv"
    android:numColumns="3"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    />
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值