`
yidongkaifa
  • 浏览: 4038855 次
文章分类
社区版块
存档分类
最新评论

android Listview 软引用SoftReference异步加载图片

 
阅读更多

网上软应用的例子很多,我也是借鉴别人修改了下,推荐一个网址:http://www.iteye.com/topic/685986

之前总是不太理解,今天认真的推敲下,记录下来方便以后用到.

HashMap<String, SoftReference<Drawable>> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了。

机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也就相当于map,临时缓存些图片drawable让我们可以直接引用,很好了解决了OOM异常.

实现代码片段:

  1. packagecom.Tianyou.Mobile.Common;
  2. importjava.io.IOException;
  3. importjava.io.InputStream;
  4. importjava.lang.ref.SoftReference;
  5. importjava.net.MalformedURLException;
  6. importjava.net.URL;
  7. importjava.util.HashMap;
  8. importcom.Tianyou.Mobile.Util.MyUtil;
  9. importandroid.graphics.Bitmap;
  10. importandroid.graphics.drawable.BitmapDrawable;
  11. importandroid.graphics.drawable.Drawable;
  12. importandroid.os.Handler;
  13. importandroid.os.Message;
  14. /***
  15. *异步加载图片缓存的实现
  16. *
  17. *@authorjia
  18. *
  19. */
  20. publicclassAsyncImageLoader{
  21. //软引用
  22. privateHashMap<String,SoftReference<Drawable>>imageCache;
  23. publicAsyncImageLoader(){
  24. imageCache=newHashMap<String,SoftReference<Drawable>>();
  25. }
  26. /***
  27. *下载图片
  28. *
  29. *@paramimageUrl
  30. *图片地址
  31. *@paramimageCallback
  32. *回调接口
  33. *@return
  34. */
  35. publicDrawableloadDrawable(finalStringimageUrl,
  36. finalImageCallbackimageCallback){
  37. if(imageCache.containsKey(imageUrl)){
  38. SoftReference<Drawable>softReference=imageCache.get(imageUrl);
  39. Drawabledrawable=softReference.get();
  40. if(drawable!=null){
  41. returndrawable;
  42. }
  43. }
  44. finalHandlerhandler=newHandler(){
  45. publicvoidhandleMessage(Messagemessage){
  46. imageCallback.imageLoaded((Drawable)message.obj,imageUrl);
  47. }
  48. };
  49. //开启线程下载图片
  50. newThread(){
  51. @Override
  52. publicvoidrun(){
  53. Drawabledrawable=loadImageFromUrl(imageUrl);
  54. //将下载的图片保存至缓存中
  55. imageCache.put(imageUrl,newSoftReference<Drawable>(drawable));
  56. Messagemessage=handler.obtainMessage(0,drawable);
  57. handler.sendMessage(message);
  58. }
  59. }.start();
  60. returnnull;
  61. }
  62. /***
  63. *根据URL下载图片(这里要进行判断,先去本地sd中查找,没有则根据URL下载,有则返回该drawable)
  64. *
  65. *@paramurl
  66. *@return
  67. */
  68. publicstaticDrawableloadImageFromUrl(StringimageURL){
  69. Bitmapbitmap=MyUtil.GetBitmap(imageURL,100);
  70. Drawabledrawable=newBitmapDrawable(bitmap);
  71. returndrawable;
  72. }
  73. //回调接口
  74. publicinterfaceImageCallback{
  75. publicvoidimageLoaded(DrawableimageDrawable,StringimageUrl);
  76. }
  77. }
上面这个类斯通见惯了,大部分都是这样实现的,我现在要讲一点,也是迷惑我很久了一点(回调接口运用)本人基础不好,所以卡在这里了,

在listview中的getview方法中要调用这个方法:

代码片段:

  1. publicDrawablegetDrawable(AsyncImageLoaderasyncImageLoader,
  2. StringimageUrl,finalImageViewimageView){
  3. Drawabledrawable=asyncImageLoader.loadDrawable(imageUrl,
  4. newImageCallback(){
  5. @Override
  6. publicvoidimageLoaded(DrawableimageDrawable,
  7. StringimageUrl){
  8. if(imageDrawable!=null)
  9. imageView.setImageDrawable(imageDrawable);
  10. else
  11. imageView.setImageResource(R.drawable.u6_normal);
  12. }
  13. });
  14. returndrawable;
  15. }
这个方法作用:获取软用中的图片,其实在我们首次进入listview中的时候,软应用是不起作用的,只是用来下载图片保存至sd卡和软引用中.这个方法就是执行了这些操作,对于参数imageView 就是在要把获取的drawable设置进去.

执行的顺利:首先我们调用的是loadDrawable这个方法,然后查找软引用中有没有该drawable,没有的话则线程下载,下载ok后会执行handleMessage中imageCallback.imageLoaded((Drawable) message.obj, imageUrl);然后执行我们已经实现了这个接口.

在getiview 中执行代码片段:

  1. Drawabledrawable=getDrawable(asyncImageLoader,Image_L,
  2. holder.iv_image);
  3. if(drawable!=null)
  4. holder.iv_image.setImageDrawable(drawable);
当我们下滑动后,然后在上滑动的时候软应用起到了效果,效率很快哦,可以和新浪聘美了,呵呵,玩笑,要优化的地方还很多.


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics