图片的三级缓存

来源:互联网 发布:势不可挡网络剧预告片 编辑:程序博客网 时间:2024/06/06 05:02

#第一权限

<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[] {            "http://img.my.csdn.net/uploads/201407/26/1406383299_1976.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383291_8239.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383265_8550.jpg",            "http://img.my.csdn.net/uploads/201407/26/1406383264_3954.jpg",            "http://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"    />
原创粉丝点击