在Android中经常性的会用到加载图片的问题,那么为了不阻塞主线程,我们首先要考虑异步操作,为了用户更好地体验我们还需要考虑对图片进行缓存。

对图片进行缓存首先要了解softreference<Bitmap>软存储机制,还有就是硬存储的方式在手机端一般就是SD卡的存储。

那么如果当我们进行图片异步加载的时候就需要考虑内存中是否有,如果内存中有的话直接从内存中取出,如果内存中没有的话,再从网上去下载。

判断内存中是否有图片要先从softreference中判断,如果没有就从SD卡中读取,如果两者都没有则从网上下载

ImgLoader.java

        
  1. packagecom.SQLiteTest;
  2. importjava.io.FileInputStream;
  3. importjava.lang.ref.SoftReference;
  4. importjava.util.Map;
  5. importandroid.content.Context;
  6. importandroid.graphics.Bitmap;
  7. importandroid.graphics.BitmapFactory;
  8. importandroid.os.Environment;
  9. publicclassPicManager{
  10. privateContextcontext;
  11. privateMap<String,SoftReference<Bitmap>>imgCache;
  12. privateFileUtilsfUtils=newFileUtils();
  13. /*
  14. *构造函数
  15. */
  16. publicPicManager(Contextcontext,
  17. Map<String,SoftReference<Bitmap>>imgCache){
  18. super();
  19. this.context=context;
  20. this.imgCache=imgCache;
  21. }
  22. /*
  23. *先从缓存中读取,如果没有的话从文件读取
  24. */
  25. publicBitmapgetFromCache(Stringurl)
  26. {
  27. Bitmapbit=null;
  28. if(imgCache.containsKey(url))
  29. {
  30. synchronized(imgCache){
  31. SoftReference<Bitmap>bitReference=imgCache.get(url);
  32. if(bitReference!=null)
  33. {
  34. bit=bitReference.get();
  35. }
  36. }
  37. }
  38. else{
  39. bit=getFromSDcard(url);
  40. imgCache.put(url,newSoftReference<Bitmap>(bit));
  41. }
  42. returnbit;
  43. }
  44. privateBitmapgetFromSDcard(Stringurl)
  45. {
  46. Bitmapbitmap=null;
  47. Stringfilename=fUtils.getFName(url);
  48. System.out.println("PicManager-->"+filename);
  49. Stringpath=Environment.getExternalStorageDirectory()+"/";
  50. try{
  51. FileInputStreamfis=context.openFileInput(path+"picture/"+filename);
  52. //FileInputStreamfis=newFileInputStream(path+"picture"+filename);
  53. bitmap=BitmapFactory.decodeStream(fis);
  54. fis.close();
  55. }catch(Exceptione){
  56. //TODOAuto-generatedcatchblock
  57. e.printStackTrace();
  58. }
  59. returnbitmap;
  60. }
  61. }

PicManager.java

        
  1. packagecom.SQLiteTest;
  2. importjava.lang.ref.SoftReference;
  3. importjava.util.HashMap;
  4. importjava.util.Map;
  5. importjava.util.concurrent.ExecutorService;
  6. importjava.util.concurrent.Executors;
  7. importandroid.content.Context;
  8. importandroid.graphics.Bitmap;
  9. importandroid.graphics.BitmapFactory;
  10. importandroid.os.Handler;
  11. publicclassImgLoader{
  12. privateContextcontext;
  13. finalMap<String,SoftReference<Bitmap>>imgCache=
  14. newHashMap<String,SoftReference<Bitmap>>();
  15. publicImgLoader(Contextcontext){
  16. super();
  17. this.context=context;
  18. }
  19. privateHandlermhandler=newHandler();
  20. privatePicManagerpm=newPicManager(context,imgCache);
  21. privateFileUtilsfuUtils=newFileUtils();
  22. privateExecutorServicethreadPool=Executors.newFixedThreadPool(5);
  23. privateDownLoaddl=newDownLoad();
  24. publicBitmaploadImg(finalStringurl,finalImgCallBackcallBack)
  25. {
  26. Bitmapbitmap=null;
  27. try{
  28. bitmap=pm.getFromCache(url);
  29. System.out.println("ImgLoader--->执行???");
  30. if(bitmap==null)
  31. {
  32. System.out.println("ImgLoader--->什么时候执行");
  33. threadPool.submit(newRunnable(){
  34. @Override
  35. publicvoidrun(){
  36. //TODOAuto-generatedmethodstub
  37. Stringfname=fuUtils.getFName(url);
  38. dl.download(url,"picture/",fname);
  39. finalBitmapbit=BitmapFactory.decodeStream(dl.getInput(url));
  40. //imgCache.put(url,newSoftReference<Bitmap>(bit));
  41. mhandler.post(newRunnable(){
  42. @Override
  43. publicvoidrun(){
  44. //TODOAuto-generatedmethodstub
  45. callBack.refresh(bit);
  46. }
  47. });
  48. }
  49. });
  50. }
  51. }catch(Exceptione){
  52. //TODO:handleexception
  53. }
  54. returnbitmap;
  55. }
  56. }

DownLoad.java

        
  1. packagecom.SQLiteTest;
  2. importjava.io.InputStream;
  3. importjava.net.HttpURLConnection;
  4. importjava.net.URL;
  5. publicclassDownLoad{
  6. publicvoiddownload(Stringurl,Stringpath,Stringfilename)
  7. {
  8. FileUtilsfUtils=newFileUtils();
  9. InputStreaminput=null;
  10. if(!fUtils.isExist(filename))
  11. {
  12. try
  13. {
  14. input=getInput(url);
  15. System.out.println("DownLoad--->"+input);
  16. fUtils.write2SDCARD(path,filename,input);
  17. }catch(Exceptione){
  18. //TODOAuto-generatedcatchblock
  19. e.printStackTrace();
  20. }
  21. }
  22. }
  23. publicInputStreamgetInput(Stringurlstr)
  24. {
  25. URLurl=null;
  26. InputStreaminput=null;
  27. try{
  28. url=newURL(urlstr);
  29. HttpURLConnectionhul=(HttpURLConnection)url.openConnection();
  30. input=hul.getInputStream();
  31. }catch(Exceptione){
  32. //TODOAuto-generatedcatchblock
  33. e.printStackTrace();
  34. }
  35. returninput;
  36. }
  37. }

FileUtilts.java

        
  1. packagecom.SQLiteTest;
  2. importjava.io.File;
  3. importjava.io.FileOutputStream;
  4. importjava.io.InputStream;
  5. importjava.io.OutputStream;
  6. importandroid.os.Environment;
  7. publicclassFileUtils{
  8. privateStringSDPATH=Environment.getExternalStorageDirectory()+"/";
  9. publicFilecreaPath(Stringpath)
  10. {
  11. Filefile=newFile(SDPATH+path);
  12. file.mkdir();
  13. returnfile;
  14. }
  15. publicFilecreaFile(StringfileName)throwsException
  16. {
  17. Filef=newFile(SDPATH+fileName);
  18. f.createNewFile();
  19. returnf;
  20. }
  21. publicbooleanisExist(StringFilename)
  22. {
  23. Filef=newFile(SDPATH+Filename);
  24. returnf.exists();
  25. }
  26. publicvoidwrite2SDCARD(Stringpath,Stringfilename,InputStreaminput)
  27. {
  28. try{
  29. creaPath(path);
  30. Filefile=creaFile(path+filename);
  31. OutputStreamoutput=newFileOutputStream(file);
  32. byte[]buffer=newbyte[4*1024];
  33. intline=0;
  34. while((line=input.read(buffer))!=-1)
  35. {
  36. output.write(buffer,0,line);
  37. }
  38. output.flush();
  39. output.close();
  40. }catch(Exceptione){
  41. //TODOAuto-generatedcatchblock
  42. e.printStackTrace();
  43. }
  44. }
  45. publicStringgetFName(Stringurl)
  46. {
  47. intstart=url.lastIndexOf("/");
  48. Stringstr=url.substring(start);
  49. returnstr;
  50. }
  51. }

ImgCallBack.java

这是个接口主要负责刷新Bitmap

        
  1. packagecom.SQLiteTest;
  2. importandroid.graphics.Bitmap;
  3. publicinterfaceImgCallBack{
  4. publicvoidrefresh(Bitmapbitmap);
  5. }

更多相关文章

  1. android 获取网络图片缓存(内存—>文件—>网络)
  2. Android(安卓)中 Activity的内存泄漏,原因以及处理方法
  3. ANDROID 探究oom内幕
  4. Android加载Bitmap出现OutofMemoryError的原因(官方译文)
  5. Android防止内存泄露
  6. android中Bitmap导致的内存溢出
  7. Android的内存,进程调度管理
  8. 利用WCF与Android实现图片上传并传参
  9. 安卓开发工程师必备技能——框架,看看你都掌握了哪些

随机推荐

  1. 为什么深度学习没有取代传统的计算机视觉
  2. Playwright自动化测试工具之高阶使用
  3. 一个数据开发人员使用的辅助工具
  4. 利用 npm 的缺陷,他获得了 130,000 美元的
  5. Python可以比C++更快,你不信?
  6. 求求你,别用 print 来 debug 了
  7. 谷歌推出人工智能DIY套件:用硬纸板打造你
  8. 谁来接棒深度学习?
  9. IBM推出开源工具帮AI抵御对抗性样本***:DN
  10. 苹果重新开源分布式数据库FoundationDB,已