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

智能推荐

day17-day20_项目实战&项目部署

DevOps是Development和Operations两个词的缩写,引用百度百科的定义:DevOps是一种方法或理念,它涵盖开发、测试、运维的整个过程。DevOps是提高软件开发、测试、运维、运营等各部门的沟通与协作质量的方法和过程,DevOps强调软件开发人员与软件测试、软件运维、质量保障(QA)部门之间有效的沟通与协作,强调通过自动化的方法去管理软件变更、软件集成,使软件从构建到测试、发布更加快捷、可靠,最终按时交付软件。传统的软件开发流程如下:1、项目经理分配模块给开发人员。

Linxu系统服务管理,systemd知识/进程优先级/平均负载/php进程CPU100%怎么解决系列知识!

进程执行时候是排队执行的,需要插队,要调整。进程重要性高,需要优先多分配CPU。调整优先级。#记住用途nice: 调整【程序运行时】的优先级 renice:调整【运行中的进程】的优先级区别:nice命令常用于修改未运行的程序再运行时的优先级,但是对于正在运行的进程,若想要修改优先级,就需要用到renice命令。衡量系统繁忙的一个综合性指标,主要是cpu/io的繁忙程度;在工作中非常常用。工作中非常的常用,具体是哪一个指标繁忙ps,top,sar看cpu。

visionPro链接相机

康耐视 visionpro 连接相机

http和https的区别

但是这种方式也有一个弊端,那就是被篡改,就是在服务端第一次给客户端公钥key1的时候,第三方把公钥key1保存起来,然后第三方生成一个公钥key3和私钥key3,然后将公钥key3给客户端,客户端并不知道这个公钥key3是被篡改的,也用公钥key3来加密公钥key2,然后第三方窃取到这个加密后的公钥key2,通过私钥key3进行解密就可以拿到公钥key2,进行保存,然后再用之前保存的公钥key1来加密给服务端,这样第三方也能获取到公钥key2。不能理解的话就画图来表示,整个逻辑很简单的。

SpringMVC基础篇(一)

服务器启动则自动装载这个servlet,实例化servlet,调用init方法,读取spring配置文件--配置中央控制器-->

Stable Diffusion WebUI 使用 VAE 增加滤镜效果

VAE(variational autoencoder)表示变分自动编码器,它是神经网络模型的一部分,可在较小的潜在空间之间对图像进行编码和解码,从而使计算速度更快。通俗点说,可以把 VAE 理解为一种滤镜,它能让图片的色彩更加饱满,告别灰蒙蒙的感觉;同时,它还能对图片的细节进行微调,改善面部和眼部,让整体效果更加出色。在 Stable Diffusion 中,绝大部分大模型已经内置了默认的 VAE,无需再外挂 VAE 了。

随便推点

Android高级工程师进阶学习,重磅分享-程序员宅基地

文章浏览阅读573次,点赞23次,收藏13次。我坚信,坚持学习,每天进步一点,滴水穿石,我们离成功都很近!以下是总结出来的字节经典面试题目,包含:计算机网络,Kotlin,数据结构与算法,Framework源码,微信小程序,NDK音视频开发,计算机网络等。字节高级Android经典面试题和答案。

RuoYi -- Git、注解机制、项目本身、_ruo-yi-git-程序员宅基地

文章浏览阅读778次。Git版本控制( Revision control)是一种在并发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。实现跨区域多人协同开发 追踪和记载一个或者多个文件的历史记录 组织和保护你的源代码和文档 统计工作量 并行开发、提高开发效率跟踪记录整个软件的开发过程 减轻开发人员的负担,节省时间,同时降低人为错误版本控制的分类1、本地版本控制 (以RCS为代表)记录文件每次的更新,可以对每个版本做一个快照,或是记录.._ruo-yi-git

汽车行业要不要引入IPD?-程序员宅基地

文章浏览阅读853次,点赞18次,收藏10次。本文中,我们站在汽车行业的视角,着重从背景、理念、流程和架构这4个比较宏观的层面,对IPD的增量进行了对照阐释。

ftp-client-2_fclient2-程序员宅基地

文章浏览阅读504次。编程语言:python 2.7 主要模块:ftplib使用cmd模块实现交互,没有完整的异常处理,根据实际情况修改!#coding=utf-8from cmd import Cmd from ftplib import FTPimport sys,ostarget_host="192.168.142.134"target_port="2121"ftp_user="user"ftp__fclient2

使用逆滤波算法deconvwnr恢复图像回复图像时,产生了很多横竖条纹。解决办法

使用逆滤波算法deconvwnr恢复图像回复图像时,产生了很多横竖条纹。解决办法

React受控绑定

概念:使用React组件的状态(useState)控制表单的状态。概念:通过获取DOM的方式获取表单的输入数据,就是获取dom对象。