图片三级缓存
来源:互联网 发布:微商跟淘宝哪个好 编辑:程序博客网 时间:2024/06/05 20:31
图片的三级缓存
何为图片的三级缓存?
- 内存缓存(优先加载,加载速度最快,不耗费流量)
- 本地缓存(次优先加载,加载速度稍块,不耗费流量)
- 网络缓存(最后加载,加载速度最慢,耗费流量)
内存缓存
package bitmap;import java.lang.ref.SoftReference;import java.util.HashMap;import android.graphics.Bitmap;import android.support.v4.util.LruCache;//内存缓存public class MemoryCacheUtils {private LruCache<String, Bitmap>mMemoryCacheUtils;public MemoryCacheUtils(){ long maxMemory=Runtime.getRuntime().maxMemory()/8; //模拟器默认16M mMemoryCacheUtils=new LruCache<String, Bitmap>((int) maxMemory){ @Override protected int sizeOf(String key, Bitmap value) { int byteCount=value.getRowBytes()*value.getHeight(); return byteCount; } };}//从内存读public Bitmap getBitmapFromMemory(String url){ return mMemoryCacheUtils.get(url) ;}//写入内存public void setBitmapToMemory(String url,Bitmap bitmap){ mMemoryCacheUtils.put(url,bitmap); }}
本地缓存
package bitmap;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.os.Environment;//本地缓存public class LocalCacheUtils {public static final String CACHE_PATH=Environment. getExternalStorageDirectory().getAbsolutePath()+"/getPhoto";//从本地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) { // TODO Auto-generated catch block e.printStackTrace(); } return null;}//向sdcard写图片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) { // TODO Auto-generated catch block e.printStackTrace(); }}}
网络缓存
package bitmap;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import com.lidroid.xutils.bitmap.callback.BitmapLoadFrom;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.widget.ImageView;//网络缓存public class NetCacheUtils {LocalCacheUtils mLocalCacheUtils;MemoryCacheUtils mMemoryCacheUtils;public NetCacheUtils(LocalCacheUtils mLocalCacheUtils,MemoryCacheUtils mMemoryCacheUtils) { this.mLocalCacheUtils=mLocalCacheUtils; this.mMemoryCacheUtils=mMemoryCacheUtils;}//从网络下载图片public void getBitmapFromNet(ImageView ivPic, String url) { new BitmapTask().execute(ivPic,url); //启动AsyncTask}//Handler和线程池的封装//第一个泛型:参数类型 第二个泛型:更新进度的泛型,第三个泛型:onPostExecute的返回结果class BitmapTask extends AsyncTask<Object,Void,Bitmap>{ private ImageView ivPic; private String url; /** * 后台耗时方法在此执行, 子线程 */ @Override protected Bitmap doInBackground(Object... params) { ivPic=(ImageView)params[0]; url=(String)params[1]; ivPic.setTag(url); //将url和imageView绑定 return downloadBitmap(url); } //更新进度,主线程 @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); } /** * 耗时方法结束后,执行该方法, 主线程 */ @Override protected void onPostExecute(Bitmap result) { if(result!=null){ String bindUrl=(String) ivPic.getTag(); if(url.equals(bindUrl)){ //确保图片给了正确的Imageview ivPic.setImageBitmap(result); mLocalCacheUtils.setBitmapToLocal(url, result); //将图片保存到本地 mMemoryCacheUtils.setBitmapToMemory(url, result);//将图片保存到内存 System.out.println("从网络读取了。。。"); } } }}//下载图片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); //Bitmap bitmap=BitmapFactory.decodeStream(inputStream); return bitmap; } } catch (IOException e) { e.printStackTrace(); }finally{ conn.disconnect(); } return null;}}
使用方法
//声明图片加载工具类private MyBitmapUtils utils; public TopNewsAdapter() { utils = new MyBitmapUtils(); }然后在getView()方法中,使用工具类中的display()方法就可以了//display(ImageView image,String url)utils.display(image, banner.pic);
以上就是三级缓存的方法以及使用。
0 0
- 图片的三级缓存
- Android 图片三级缓存
- Android 图片三级缓存
- Android 图片三级缓存
- 三级图片缓存介绍
- 图片的三级缓存
- 图片的三级缓存
- 图片处理,三级缓存
- 三级缓存图片类
- android图片三级缓存
- Android三级图片缓存
- 关于图片三级缓存
- 图片的三级缓存
- Android图片三级缓存
- 图片三级缓存
- android图片三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 分治递归 棋盘问题
- 数据结构-栈的基本操作实现
- Java通过JNI调用C++程序
- jxls导入excel
- LeetCode算法题——24. Swap Nodes in Pairs
- 图片三级缓存
- shell之文本过滤(awk)
- 高德已知圆心,半径,计算圆弧坐标
- 使用GCD 信号量来实现iOS 同步网络请求
- [(机器学习)概率统计]极大似然估计MLE原理+python实现
- 08 const
- Hibernate(8)Stucts+Hibernate+接口编程
- Android 使用 TraceView 分析卡顿问题
- Android Studio调试打包签名设置