智慧北京5

来源:互联网 发布:数据库的面试题及答案 编辑:程序博客网 时间:2024/06/10 08:55

1.三级缓存原理

1.BitmapUtils会自动帮我们进行缓存
2.写一个BitmapUtil
内存缓存
本地缓存
网络缓存
<span style="font-size:14px;"><span style="font-size:14px;">/** * 自定义图片加载工具 *  * @author Kevin *  */public class MyBitmapUtils {NetCacheUtils mNetCacheUtils;LocalCacheUtils mLocalCacheUtils;MemoryCacheUtils mMemoryCacheUtils;public MyBitmapUtils() {mMemoryCacheUtils = new MemoryCacheUtils();mLocalCacheUtils = new LocalCacheUtils();mNetCacheUtils = new NetCacheUtils(mLocalCacheUtils, mMemoryCacheUtils);}public void display(ImageView ivPic, String url) {ivPic.setImageResource(R.drawable.news_pic_default);// 设置默认加载图片Bitmap bitmap = null;// 从内存读bitmap = mMemoryCacheUtils.getBitmapFromMemory(url);if (bitmap != null) {ivPic.setImageBitmap(bitmap);System.out.println("从内存读取图片啦...");return;}// 从本地读bitmap = mLocalCacheUtils.getBitmapFromLocal(url);if (bitmap != null) {ivPic.setImageBitmap(bitmap);System.out.println("从本地读取图片啦...");mMemoryCacheUtils.setBitmapToMemory(url, bitmap);// 将图片保存在内存return;}// 从网络读mNetCacheUtils.getBitmapFromNet(ivPic, url);}}</span></span>

2.网络缓存&AsyncTask

1.重写
<span style="font-size:14px;">/** * 网络缓存 *  * @author Kevin *  */public class NetCacheUtils {private LocalCacheUtils mLocalCacheUtils;private MemoryCacheUtils mMemoryCacheUtils;public NetCacheUtils(LocalCacheUtils localCacheUtils,MemoryCacheUtils memoryCacheUtils) {mLocalCacheUtils = localCacheUtils;mMemoryCacheUtils = memoryCacheUtils;}/** * 从网络下载图片 *  * @param ivPic * @param url */public void getBitmapFromNet(ImageView ivPic, String url) {new BitmapTask().execute(ivPic, url);// 启动AsyncTask,// 参数会在doInbackground中获取}/** * Handler和线程池的封装 *  * 第一个泛型: 参数类型 第二个泛型: 更新进度的泛型, 第三个泛型是onPostExecute的返回结果 *  * @author Kevin *  */class BitmapTask extends AsyncTask<Object, Void, Bitmap> {private ImageView ivPic;private String url;/** * 后台耗时方法在此执行, 子线程 */@Overrideprotected Bitmap doInBackground(Object... params) {ivPic = (ImageView) params[0];url = (String) params[1];ivPic.setTag(url);// 将url和imageview绑定return downloadBitmap(url);}/** * 更新进度, 主线程 */@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);}/** * 耗时方法结束后,执行该方法, 主线程 */@Overrideprotected void onPostExecute(Bitmap result) {if (result != null) {String bindUrl = (String) ivPic.getTag();if (url.equals(bindUrl)) {// 确保图片设定给了正确的imageviewivPic.setImageBitmap(result);mLocalCacheUtils.setBitmapToLocal(url, result);// 将图片保存在本地mMemoryCacheUtils.setBitmapToMemory(url, result);// 将图片保存在内存System.out.println("从网络缓存读取图片啦...");}}}}/** * 下载图片 *  * @param url * @return */private Bitmap downloadBitmap(String url) {HttpURLConnection conn = null;try {conn = (HttpURLConnection) new URL(url).openConnection();conn.setConnectTimeout(5000);conn.setReadTimeout(5000);conn.setRequestMethod("GET");conn.connect();int responseCode = conn.getResponseCode();if (responseCode == 200) {InputStream inputStream = conn.getInputStream();//图片压缩处理BitmapFactory.Options option = new BitmapFactory.Options();option.inSampleSize = 2;//宽高都压缩为原来的二分之一, 此参数需要根据图片要展示的大小来确定option.inPreferredConfig = Bitmap.Config.RGB_565;//设置图片格式Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, option);return bitmap;}} catch (Exception e) {e.printStackTrace();} finally {conn.disconnect();}return null;}}</span>


4.本地缓存

<span style="font-size:14px;">/** * 本地缓存 *  * @author Kevin *  */public class LocalCacheUtils {public static final String CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/zhbj_cache_52";/** * 从本地sdcard读图片 */public Bitmap getBitmapFromLocal(String url) {try {String fileName = MD5Encoder.encode(url);File file = new File(CACHE_PATH, fileName);if (file.exists()) {Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));return bitmap;}} catch (Exception e) {e.printStackTrace();}return null;}/** * 向sdcard写图片 *  * @param url * @param bitmap */public void setBitmapToLocal(String url, Bitmap bitmap) {try {String fileName = MD5Encoder.encode(url);File file = new File(CACHE_PATH, fileName);File parentFile = file.getParentFile();if (!parentFile.exists()) {// 如果文件夹不存在, 创建文件夹parentFile.mkdirs();}// 将图片保存在本地bitmap.compress(CompressFormat.JPEG, 100,new FileOutputStream(file));} catch (Exception e) {e.printStackTrace();}}}</span>

6.内存缓存

<span style="font-size:14px;">/** * 内存缓存 *  * @author Kevin *  */public class MemoryCacheUtils {// private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new// HashMap<String, SoftReference<Bitmap>>();private LruCache<String, Bitmap> mMemoryCache;public MemoryCacheUtils() {long maxMemory = Runtime.getRuntime().maxMemory() / 8;// 模拟器默认是16MmMemoryCache = new LruCache<String, Bitmap>((int) maxMemory) {@Overrideprotected int sizeOf(String key, Bitmap value) {int byteCount = value.getRowBytes() * value.getHeight();// 获取图片占用内存大小return byteCount;}};}/** * 从内存读 *  * @param url */public Bitmap getBitmapFromMemory(String url) {// SoftReference<Bitmap> softReference = mMemoryCache.get(url);// if (softReference != null) {// Bitmap bitmap = softReference.get();// return bitmap;// }return mMemoryCache.get(url);}/** * 写内存 *  * @param url * @param bitmap */public void setBitmapToMemory(String url, Bitmap bitmap) {// SoftReference<Bitmap> softReference = new// SoftReference<Bitmap>(bitmap);// mMemoryCache.put(url, softReference);mMemoryCache.put(url, bitmap);}}</span>


8.图片压缩


9.内存溢出解决方案





0 0
原创粉丝点击