在Android图片缓存
16lz
2021-01-26
在Android中经常性的会用到加载图片的问题,那么为了不阻塞主线程,我们首先要考虑异步操作,为了用户更好地体验我们还需要考虑对图片进行缓存。
对图片进行缓存首先要了解softreference<Bitmap>软存储机制,还有就是硬存储的方式在手机端一般就是SD卡的存储。
那么如果当我们进行图片异步加载的时候就需要考虑内存中是否有,如果内存中有的话直接从内存中取出,如果内存中没有的话,再从网上去下载。
判断内存中是否有图片要先从softreference中判断,如果没有就从SD卡中读取,如果两者都没有则从网上下载
ImgLoader.java
- packagecom.SQLiteTest;
- importjava.io.FileInputStream;
- importjava.lang.ref.SoftReference;
- importjava.util.Map;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.os.Environment;
- publicclassPicManager{
- privateContextcontext;
- privateMap<String,SoftReference<Bitmap>>imgCache;
- privateFileUtilsfUtils=newFileUtils();
- /*
- *构造函数
- */
- publicPicManager(Contextcontext,
- Map<String,SoftReference<Bitmap>>imgCache){
- super();
- this.context=context;
- this.imgCache=imgCache;
- }
- /*
- *先从缓存中读取,如果没有的话从文件读取
- */
- publicBitmapgetFromCache(Stringurl)
- {
- Bitmapbit=null;
- if(imgCache.containsKey(url))
- {
- synchronized(imgCache){
- SoftReference<Bitmap>bitReference=imgCache.get(url);
- if(bitReference!=null)
- {
- bit=bitReference.get();
- }
- }
- }
- else{
- bit=getFromSDcard(url);
- imgCache.put(url,newSoftReference<Bitmap>(bit));
- }
- returnbit;
- }
- privateBitmapgetFromSDcard(Stringurl)
- {
- Bitmapbitmap=null;
- Stringfilename=fUtils.getFName(url);
- System.out.println("PicManager-->"+filename);
- Stringpath=Environment.getExternalStorageDirectory()+"/";
- try{
- FileInputStreamfis=context.openFileInput(path+"picture/"+filename);
- //FileInputStreamfis=newFileInputStream(path+"picture"+filename);
- bitmap=BitmapFactory.decodeStream(fis);
- fis.close();
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- returnbitmap;
- }
- }
PicManager.java
- packagecom.SQLiteTest;
- importjava.lang.ref.SoftReference;
- importjava.util.HashMap;
- importjava.util.Map;
- importjava.util.concurrent.ExecutorService;
- importjava.util.concurrent.Executors;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.os.Handler;
- publicclassImgLoader{
- privateContextcontext;
- finalMap<String,SoftReference<Bitmap>>imgCache=
- newHashMap<String,SoftReference<Bitmap>>();
- publicImgLoader(Contextcontext){
- super();
- this.context=context;
- }
- privateHandlermhandler=newHandler();
- privatePicManagerpm=newPicManager(context,imgCache);
- privateFileUtilsfuUtils=newFileUtils();
- privateExecutorServicethreadPool=Executors.newFixedThreadPool(5);
- privateDownLoaddl=newDownLoad();
- publicBitmaploadImg(finalStringurl,finalImgCallBackcallBack)
- {
- Bitmapbitmap=null;
- try{
- bitmap=pm.getFromCache(url);
- System.out.println("ImgLoader--->执行???");
- if(bitmap==null)
- {
- System.out.println("ImgLoader--->什么时候执行");
- threadPool.submit(newRunnable(){
- @Override
- publicvoidrun(){
- //TODOAuto-generatedmethodstub
- Stringfname=fuUtils.getFName(url);
- dl.download(url,"picture/",fname);
- finalBitmapbit=BitmapFactory.decodeStream(dl.getInput(url));
- //imgCache.put(url,newSoftReference<Bitmap>(bit));
- mhandler.post(newRunnable(){
- @Override
- publicvoidrun(){
- //TODOAuto-generatedmethodstub
- callBack.refresh(bit);
- }
- });
- }
- });
- }
- }catch(Exceptione){
- //TODO:handleexception
- }
- returnbitmap;
- }
- }
DownLoad.java
- packagecom.SQLiteTest;
- importjava.io.InputStream;
- importjava.net.HttpURLConnection;
- importjava.net.URL;
- publicclassDownLoad{
- publicvoiddownload(Stringurl,Stringpath,Stringfilename)
- {
- FileUtilsfUtils=newFileUtils();
- InputStreaminput=null;
- if(!fUtils.isExist(filename))
- {
- try
- {
- input=getInput(url);
- System.out.println("DownLoad--->"+input);
- fUtils.write2SDCARD(path,filename,input);
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }
- publicInputStreamgetInput(Stringurlstr)
- {
- URLurl=null;
- InputStreaminput=null;
- try{
- url=newURL(urlstr);
- HttpURLConnectionhul=(HttpURLConnection)url.openConnection();
- input=hul.getInputStream();
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- returninput;
- }
- }
FileUtilts.java
- packagecom.SQLiteTest;
- importjava.io.File;
- importjava.io.FileOutputStream;
- importjava.io.InputStream;
- importjava.io.OutputStream;
- importandroid.os.Environment;
- publicclassFileUtils{
- privateStringSDPATH=Environment.getExternalStorageDirectory()+"/";
- publicFilecreaPath(Stringpath)
- {
- Filefile=newFile(SDPATH+path);
- file.mkdir();
- returnfile;
- }
- publicFilecreaFile(StringfileName)throwsException
- {
- Filef=newFile(SDPATH+fileName);
- f.createNewFile();
- returnf;
- }
- publicbooleanisExist(StringFilename)
- {
- Filef=newFile(SDPATH+Filename);
- returnf.exists();
- }
- publicvoidwrite2SDCARD(Stringpath,Stringfilename,InputStreaminput)
- {
- try{
- creaPath(path);
- Filefile=creaFile(path+filename);
- OutputStreamoutput=newFileOutputStream(file);
- byte[]buffer=newbyte[4*1024];
- intline=0;
- while((line=input.read(buffer))!=-1)
- {
- output.write(buffer,0,line);
- }
- output.flush();
- output.close();
- }catch(Exceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- publicStringgetFName(Stringurl)
- {
- intstart=url.lastIndexOf("/");
- Stringstr=url.substring(start);
- returnstr;
- }
- }
ImgCallBack.java
这是个接口主要负责刷新Bitmap
- packagecom.SQLiteTest;
- importandroid.graphics.Bitmap;
- publicinterfaceImgCallBack{
- publicvoidrefresh(Bitmapbitmap);
- }
更多相关文章
- android 获取网络图片缓存(内存—>文件—>网络)
- Android(安卓)中 Activity的内存泄漏,原因以及处理方法
- ANDROID 探究oom内幕
- Android加载Bitmap出现OutofMemoryError的原因(官方译文)
- Android防止内存泄露
- android中Bitmap导致的内存溢出
- Android的内存,进程调度管理
- 利用WCF与Android实现图片上传并传参
- 安卓开发工程师必备技能——框架,看看你都掌握了哪些