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

智能推荐

2023.8DataWhale_cv夏令营第三期笔记_逻辑回归需要训练很多轮么-程序员宅基地

文章浏览阅读257次。使用官方提供的脑PET数据集,构建逻辑回归模型来进行脑PET图像的疾病预测,数据集被分为两类,分别为轻度认知障碍(MCI)患者的脑部影像数据和健康人(NC)的脑部影像数据,图像数据格式为nii,因此本赛题可抽象为一个二分类问题。nii是一种常用的医学图像数据格式,主要用于存储和交换神经影像数据。以下是一些主要特点:1.主要用于存储3D(三维)医学图像数据,如MRI(磁共振成像)和CT(计算机断层扫描)图像。2.支持多种数据类型,使得其可以支持不同类型的数据处理和分析。_逻辑回归需要训练很多轮么

通用指南-营销和设计中的增强现实(AR)-程序员宅基地

文章浏览阅读1.2k次,点赞31次,收藏26次。增强现实通常被视为一个利基领域。然而,在过去的两年里,它已经到了一个成熟的阶段,应该在一般的营销堆栈中进行考虑。正如我们所看到的,这个市场是巨大的,而且随着主要参与者向这项技术投入大量投资,它只会继续增长。从苹果到Meta,大公司都相信身临其境的未来,而想要获得成功的营销人员和创意人员也加入了进来。本文第三章,最佳设计实践除了深入讨论AR设计的原则外,还全面推荐了AI设计工具。旨在帮助读者的AI作品脱颖而出。

linux c 网络编程_usage: ./tcp_client hostname-程序员宅基地

文章浏览阅读473次。OSI七层网络模型由下至上为1至7层,分别为:物理层(Physical layer),数据链路层(Data link layer),网络层(Network layer),传输层(Transport layer),会话层(Session layer),表示层(Presentation layer),应用层(Application layer)。1.1 应用层,很简单,就是应用程序。这一层负责_usage: ./tcp_client hostname

Nexus3配置yum代理 pypi代理和npm代理(三合一)_maximum component age-程序员宅基地

文章浏览阅读2.8k次。环境准备安装 maven 安装 java 环境[root@cicd-nexus ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz[root@cicd-nexus ~]# tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/[root@cicd-nexus ~]# tar xf _maximum component age

使用js-xlsx handsontable 分批次导入Excel数据(兼容ie9)_js 导excel 分批写入-程序员宅基地

文章浏览阅读1.6k次。使用js-xlsx handsontable 可以把本地excel 解析到网页上,然后分批次传入后台。在chrome 下 可以参考 https://github.com/SheetJS/js-xlsx 【Browser file upload form element】但需要使用FileReader api 这个只有ie10 才开始支持。兼容ie9 ,ie9需要通过flash 来支持..._js 导excel 分批写入

wxWidgets 自绘按钮(图片+文字)_wxwidgets 中文按钮-程序员宅基地

文章浏览阅读2.5k次。在wxWidgets中,想要通过其本身的控件来实现图片+文件的按钮,貌似不太容易做到。但是可以通过重载wxControl来自绘图片+文件按钮。下面给出的是已经封装好的按钮类:wxBitmapButtonEx.h#ifndef _BITMAP_BUTTON_EX_H#define _BITMAP_BUTTON_EX_H#include "wx/wx.h"enum eBitm_wxwidgets 中文按钮

随便推点

invalidate()和postInvalidate()的区别_postinvalidate和invalidate的区别-程序员宅基地

文章浏览阅读847次。invalidate()与postInvalidate()都用于刷新View,主要区别是invalidate()在主线程中调用,若在子线程中使用需要配合handler;而postInvalidate()可在子线程中直接调用。postInvalidate它是向主线程发送个Message,然后handleMessage时,调用了invalidate()函数。(系统帮我们 写好了 Handle..._postinvalidate和invalidate的区别

计算机表格 求差,Excel表格中求差函数公式怎么用-程序员宅基地

文章浏览阅读9.1k次。excel数据进行分类汇总的步骤在做分类汇总前,我们需要对数据先进行排序,否则分类汇总无法进行。得到排序后的表格。点击上方工具栏中的“数据”→“分类汇总”。在弹出的对话框中选择“分类字段”→“汇总方式”→“决定汇总项”。点击确定出现数据汇总结果。Excel表格中求差函数公式使用的方法第一步:打开Excel表格,单击第一排,第三个“单元格”,也就是C1,在C1中输入“=A1-B1”;第二步:这个公式..._表格求差公式

Linux下OpenCV的安装与测试成功教程(解决E: 无法定位软件包 libjasper-dev、无法找到directory `opencv.pc‘、fatal error:“highgui.h“)_无法定位软件包 libgazebo-dev-程序员宅基地

文章浏览阅读1.5w次,点赞49次,收藏169次。前言好激动,断断续续装了两三天才装上,踩了好多坑。这里把成功安装的步骤详细写下来,如果有小伙伴需要,可以尝试一下,但我不能保证你也可以装好。首先说一下我的各个版本(不谈版本的安装教程都是耍流氓!)是用虚拟机软件:VirtualBOX6.1.30系统版本:ubuntu-20.04.3-desktop-amd64(最小安装模式,中文)OpenCV版本:4.5.5安装时间:2022.2.11下面是步骤1、进入OpenCV的官方下载地址Releases - OpenCV,下载So_无法定位软件包 libgazebo-dev

红帽子粉帽子绿帽子II(递归,递推)-程序员宅基地

文章浏览阅读320次,点赞6次,收藏10次。/是上一个的进化版,相邻的可以一样但是不能都是绿色,注意条件;~~~//仅当笔者个人备忘录使用。

解决Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 7.6.5)“ failed问题-程序员宅基地

文章浏览阅读6.7k次。由于Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 7.6.5)安装失败,导致我的安卓虚拟机无法启动。解决办法有一下几种:1.开机进入BIOS打开Virtual虚拟化功能,然后进入Androidstudio 的SDK manager里面安装HAXM2.关闭系统中的Hyper-v,进入控制面板的程序和功能,将Hyper-v去选即可。3.如果前面的方法都不行,那么建议你重新下载AndroidStudio最新版进行安装_intel x86 emulator

PowerBuilder的语言基础-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏15次。 每一种语言都有一组基本的语法约定,POWERBUILDER也不例外。 (1)断行、续行与多条语句 通常情况下,powerbuilder的一条语句是写到一行上的,该条语句在书写完毕之后,按键转到下一行,开始写下一句的内容。也就是说,在PowerBuilder中,使用键作为一行的结束。在PowerBuilder语句比较长的情况下,为了方便阅读,可以使用续行符号把一条语句写到几_powerbuilder

推荐文章

热门文章

相关标签