三级缓存的使用框架
来源:互联网 发布:淘宝店铺收入该怎么算 编辑:程序博客网 时间:2024/04/29 16:42
package liujianrui.bawei.com.three_level_buffer.utils;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.util.DisplayMetrics;import android.util.Log;import android.widget.ImageView;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.lang.ref.SoftReference;import java.util.HashMap;import java.util.Map;import cz.msebera.android.httpclient.HttpResponse;import cz.msebera.android.httpclient.client.HttpClient;import cz.msebera.android.httpclient.client.methods.HttpGet;import cz.msebera.android.httpclient.impl.client.DefaultHttpClient;/** * Created by ASUS on 2017/3/23. */ //这是一个工具类:可以自己封装,Mainactivity需要自己写,自己调用:public class Bitmaputils {//这是执行第一个网络, private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: ImageViewToBitmap imageViewToBitmap = (ImageViewToBitmap) msg.obj; imageViewToBitmap.iv.setImageBitmap(imageViewToBitmap.bitmap); Log.i("xxxxl",imageViewToBitmap.bitmap+""); break; } } };//软引用 根据键值获取Bitmap private Map<String, SoftReference<Bitmap>> map = new HashMap<String, SoftReference<Bitmap>>(); //图片本地缓存路径 String path= Environment.getExternalStorageDirectory()+"/imgache"; File file=new File(path); Context context; public Bitmaputils(Context context) { this.context = context; if(!file.exists()) { file.mkdirs(); } } //加载图片的方法 public void display(ImageView iv, String url) { //内存缓存 Bitmap bitmap = loadMemory(url); if (bitmap != null) { iv.setImageBitmap(bitmap); Log.i("axxx",bitmap+""); } else { //sdcard缓存 bitmap = loadSD(url); if (bitmap != null) { iv.setImageBitmap(bitmap); Log.i("xxxx",bitmap+""); } else { //网络缓存 loadInternetImage(iv, url); } } } //获取网络图片 private void loadInternetImage(ImageView iv, String url) { //开子线程做耗时操作 new Thread(new DownloadImage(iv, url)).start(); } private class DownloadImage implements Runnable{ ImageView iv; String url; private FileOutputStream fileOutputStream; private InputStream inputStream; public DownloadImage(ImageView iv, String url) { this.iv = iv; this.url = url; } @Override public void run() { HttpClient clent = new DefaultHttpClient(); HttpGet get = new HttpGet(url); try { HttpResponse execute = clent.execute(get); if(execute.getStatusLine().getStatusCode() == 200) { inputStream = execute.getEntity().getContent(); String name = getFileName(url); File filename = new File(file, name); fileOutputStream = new FileOutputStream(filename); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, len); } inputStream.close(); fileOutputStream.close(); //sdcard缓存 Bitmap bitmap = loadSD(url); //ImageView转换成Bitmap转换成Bitmap ImageViewToBitmap ivtb = new ImageViewToBitmap(iv, bitmap); Message message = Message.obtain(handler, 0, ivtb); message.sendToTarget(); } } catch (Exception e) { e.printStackTrace(); } } } //获取图片的名称 private String getFileName(String url) { return Md5Utils.encode(url) + ".jpg"; } //获取本地图片 private Bitmap loadSD(String url) { String name = getFileName(url); File filename = new File(file, name); if (filename.exists()) { //BitmapFactory选项 BitmapFactory.Options options = new BitmapFactory.Options(); //加载图片宽高 options.inJustDecodeBounds = true; BitmapFactory.decodeFile(name, options); //获取图片和手机屏幕宽高 int outWidth = options.outWidth; int outHeight = options.outHeight; DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); int widthPixels = displayMetrics.widthPixels; int heightPixels = displayMetrics.heightPixels; //图片跟手机屏幕进行比对 int scale = 0; int scaleX = outWidth / widthPixels; int scaleY = outHeight / heightPixels; scale = scaleX > scaleY ? scaleX : scaleY; if (scale == 0) { scale = 1; } options.inJustDecodeBounds = false; options.inSampleSize = scale; Bitmap bitmap = BitmapFactory.decodeFile(filename.getAbsolutePath(), options); //内存缓存 SoftReference<Bitmap> value = new SoftReference<Bitmap>(bitmap); map.put(name, value); return bitmap; } return null; } //ImageView转换成Bitmap转换成Bitmap private class ImageViewToBitmap { ImageView iv; Bitmap bitmap; public ImageViewToBitmap(ImageView iv, Bitmap bitmap) { this.iv = iv; this.bitmap = bitmap; } } //缓存到内存 private Bitmap loadMemory(String url) { SoftReference<Bitmap> value = map.get(url); if (value != null) { Bitmap bitmap = value.get(); return bitmap; } return null; } }
谨记需建一个类
public class Md5Utils { public static String encode(String password){ try { MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] result = digest.digest(password.getBytes()); StringBuffer sb = new StringBuffer(); for(byte b : result){ int number = (int)(b & 0xff) ; String str = Integer.toHexString(number); if(str.length()==1){ sb.append("0"); } sb.append(str); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); //can't reach return ""; } }}
0 0
- 三级缓存的使用框架
- 三级缓存的使用
- Volley框架下的三级缓存的使用工具类
- Android三级缓存的基础框架学习
- 使用volley实现android的三级缓存
- ok请求数据三级缓存的使用
- 使用Volley网络框架实现ImageCache三级缓存
- 仿Picasso框架,实现简单的图片三级缓存处理
- Android Volley框架的使用之图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- GridView的三级缓存
- 图片的三级缓存
- Git的三级缓存
- VTK 开源医学项目
- Struts框架的数据验证可分为几种类型?
- 今天教大家PDF文件怎么批量去除页眉页脚
- 浅谈web网站架构演变过程
- hihocoder #1300 : 展胜地的鲤鱼旗 dp
- 三级缓存的使用框架
- 安卓下调用系统拍照,系统相册功能实现
- Android 多CPU架构支持所需要了解的知识
- HTTP的时延
- mac修改mysql端口
- AndroidStudio 关于Log打印问题的总结
- Pangolin 安装及其使用
- 【面试】简述Form Bean的表单验证流程
- oj刷题 Problem C: 五位以内的对称素数