android Listview 软引用SoftReference异步加载图片_listview软引用-程序员宅基地

技术标签: image  java  null  listview  android  url  Android  

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

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

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

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

   

    实现代码片段:

    

[java]  view plain copy
  1. package com.Tianyou.Mobile.Common;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.lang.ref.SoftReference;  
  6. import java.net.MalformedURLException;  
  7. import java.net.URL;  
  8. import java.util.HashMap;  
  9.   
  10. import com.Tianyou.Mobile.Util.MyUtil;  
  11.   
  12. import android.graphics.Bitmap;  
  13. import android.graphics.drawable.BitmapDrawable;  
  14. import android.graphics.drawable.Drawable;  
  15. import android.os.Handler;  
  16. import android.os.Message;  
  17.   
  18. /*** 
  19.  * 异步加载图片 缓存的实现 
  20.  *  
  21.  * @author jia 
  22.  *  
  23.  */  
  24. public class AsyncImageLoader {  
  25.     // 软引用  
  26.     private HashMap<String, SoftReference<Drawable>> imageCache;  
  27.   
  28.     public AsyncImageLoader() {  
  29.         imageCache = new HashMap<String, SoftReference<Drawable>>();  
  30.     }  
  31.   
  32.     /*** 
  33.      * 下载图片 
  34.      *  
  35.      * @param imageUrl 
  36.      *            图片地址 
  37.      * @param imageCallback 
  38.      *            回调接口 
  39.      * @return 
  40.      */  
  41.     public Drawable loadDrawable(final String imageUrl,  
  42.             final ImageCallback imageCallback) {  
  43.         if (imageCache.containsKey(imageUrl)) {  
  44.             SoftReference<Drawable> softReference = imageCache.get(imageUrl);  
  45.             Drawable drawable = softReference.get();  
  46.             if (drawable != null) {  
  47.                 return drawable;  
  48.             }  
  49.         }  
  50.         final Handler handler = new Handler() {  
  51.             public void handleMessage(Message message) {  
  52.                 imageCallback.imageLoaded((Drawable) message.obj, imageUrl);  
  53.             }  
  54.         };  
  55.         // 开启线程下载图片  
  56.         new Thread() {  
  57.             @Override  
  58.             public void run() {  
  59.                 Drawable drawable = loadImageFromUrl(imageUrl);  
  60.                 // 将下载的图片保存至缓存中  
  61.                 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));  
  62.                 Message message = handler.obtainMessage(0, drawable);  
  63.                 handler.sendMessage(message);  
  64.             }  
  65.         }.start();  
  66.         return null;  
  67.     }  
  68.   
  69.     /*** 
  70.      * 根据URL下载图片(这里要进行判断,先去本地sd中查找,没有则根据URL下载,有则返回该drawable) 
  71.      *  
  72.      * @param url 
  73.      * @return 
  74.      */  
  75.     public static Drawable loadImageFromUrl(String imageURL) {  
  76.   
  77.         Bitmap bitmap = MyUtil.GetBitmap(imageURL, 100);  
  78.         Drawable drawable = new BitmapDrawable(bitmap);  
  79.         return drawable;  
  80.   
  81.     }  
  82.   
  83.     // 回调接口  
  84.     public interface ImageCallback {  
  85.         public void imageLoaded(Drawable imageDrawable, String imageUrl);  
  86.     }  
  87.   
  88. }  
     上面这个类斯通见惯了,大部分都是这样实现的,我现在要讲一点,也是迷惑我很久了一点(回调接口运用)本人基础不好,所以卡在这里了,

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

     代码片段:

[java]  view plain copy
  1. public Drawable getDrawable(AsyncImageLoader asyncImageLoader,  
  2.             String imageUrl, final ImageView imageView) {  
  3.         Drawable drawable = asyncImageLoader.loadDrawable(imageUrl,  
  4.                 new ImageCallback() {  
  5.                     @Override  
  6.                     public void imageLoaded(Drawable imageDrawable,  
  7.                             String imageUrl) {  
  8.                         if (imageDrawable != null)  
  9.                             imageView.setImageDrawable(imageDrawable);  
  10.                         else  
  11.                             imageView.setImageResource(R.drawable.u6_normal);  
  12.                     }  
  13.                 });  
  14.         return drawable;  
  15.     }  
  这个方法作用:获取软用中的图片,其实在我们首次进入listview中的时候,软应用是不起作用的,只是用来下载图片保存至sd卡和软引用中.这个方法就是执行了这些操作,对于参数imageView 就是在要把获取的drawable设置进去.

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

     在getiview 中执行代码片段:

     

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


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/offbye/article/details/7953544

智能推荐

如何配置filezilla服务端和客户端_filezilla server for windows (32bit x86)-程序员宅基地

文章浏览阅读7.8k次,点赞3次,收藏9次。如何配置filezilla服务端和客户端百度‘filezilla server’下载最新版。注意点:下载的版本如果是32位的适用xp和win2003,百度首页的是适用于win7或更高的win系统。32和64内容无异。安装过程也是一样的。一、这里的filezilla包括服务端和客户端。我们先来用filezilla server 架设ftp服务端。看步骤。1选择标准版的就可以了。 _filezilla server for windows (32bit x86)

深度学习图像处理01:图像的本质-程序员宅基地

文章浏览阅读724次,点赞18次,收藏8次。深度学习作为一种强大的机器学习技术,已经成为图像处理领域的核心技术之一。通过模拟人脑处理信息的方式,深度学习能够从图像数据中学习到复杂的模式和特征,从而实现从简单的图像分类到复杂的场景理解等多种功能。要充分发挥深度学习在图像处理中的潜力,我们首先需要理解图像的本质。本文旨在深入探讨深度学习图像处理的基础概念,为初学者铺平通往高级理解的道路。我们将从最基础的问题开始:图像是什么?我们如何通过计算机来理解和处理图像?

数据探索阶段——对样本数据集的结构和规律进行分析_数据分析 规律集-程序员宅基地

文章浏览阅读62次。在收集到初步的样本数据之后,接下来该考虑的问题有:(1)样本数据集的数量和质量是否满足模型构建的要求。(2)是否出现从未设想过的数据状态。(3)是否有明显的规律和趋势。(4)各因素之间有什么样的关联性。解决方案:检验数据集的数据质量、绘制图表、计算某些特征量等,对样本数据集的结构和规律进行分析。从数据质量分析和数据特征分析两个角度出发。_数据分析 规律集

上传计算机桌面文件图标不见,关于桌面上图标都不见了这类问题的解决方法-程序员宅基地

文章浏览阅读8.9k次。关于桌面上图标都不见了这类问题的解决方法1、在桌面空白处右击鼠标-->排列图标-->勾选显示桌面图标。2、如果问题还没解决,那么打开任务管理器(同时按“Ctrl+Alt+Del”即可打开),点击“文件”→“新建任务”,在打开的“创建新任务”对话框中输入“explorer”,单击“确定”按钮后,稍等一下就可以见到桌面图标了。3、问题还没解决,按Windows键+R(或者点开始-->..._上传文件时候怎么找不到桌面图标

LINUX 虚拟网卡tun例子——修改_怎么设置tun的接收缓冲-程序员宅基地

文章浏览阅读1.5k次。参考:http://blog.csdn.net/zahuopuboss/article/details/9259283 #include #include #include #include #include #include #include #include #include #include #include #include _怎么设置tun的接收缓冲

UITextView 评论输入框 高度自适应-程序员宅基地

文章浏览阅读741次。创建一个inputView继承于UIView- (instancetype)initWithFrame:(CGRect)frame{ self = [superinitWithFrame:frame]; if (self) { self.backgroundColor = [UIColorcolorWithRed:0.13gre

随便推点

字符串基础面试题_java字符串相关面试题-程序员宅基地

文章浏览阅读594次。字符串面试题(2022)_java字符串相关面试题

VSCODE 实现远程GUI,显示plt.plot, 设置x11端口转发_vscode远程ssh连接服务器 python 显示plt-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏21次。VSCODE 实现远程GUI,显示plt.plot, 设置x11端口转发问题服务器 linux ubuntu16.04本地 windows 10很多小伙伴发现VSCode不能显示figure,只有用自带的jupyter才能勉强个截图、或者转战远程桌面,这对数据分析极为不方便。在命令行键入xeyes(一个显示图像的命令)会failed,而桌面下会出现:但是Xshell能实现X11转发图像,有交互功能,但只能用Xshell输入命令plot,实在不方便。其实VScode有X11转发插件!!方法_vscode远程ssh连接服务器 python 显示plt

element-ui switch开关打开和关闭时的文字设置样式-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏2次。element switch开关文字显示element中switch开关把on-text 和 off-text 属性改为 active-text 和 inactive-text 属性.怎么把文字描述显示在开关上?下面就是实现方法: 1 <el-table-column label="状态"> 2 <template slot-scope="scope">..._el-switch 不同状态显示不同字

HttpRequestUtil方法get、post、JsonToPost_httprequestutil.httpget-程序员宅基地

文章浏览阅读785次。java后台发起请求使用的工具类package com.cennavi.utils;import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apach_httprequestutil.httpget

App-V轻量级应用程序虚拟化之三客户端测试-程序员宅基地

文章浏览阅读137次。在前两节我们部署了App-V Server并且序列化了相应的软件,现在可谓是万事俱备,只欠东风。在这篇博客里面主要介绍一下如何部署客户端并实现应用程序的虚拟化。在这里先简要的说一下应用虚拟化的工作原理吧!App-V Streaming 就是利用templateServer序列化出一个软件运行的虚拟环境,然后上传到app-v Server上,最后客户..._app-v 客户端