ListView与GridView异步加载图片
原理很简单,主要是用到了回调方法,下面是异步加载图片的类
<span style="font-size:16px;">package com.xxx.xxx;
import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.URL; import java.util.HashMap;
import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message;
/** * 图片异步加载 * */
public class AsyncImageLoader {
private HashMap<String, SoftReference<Drawable>> imageCache;
public AsyncImageLoader() { imageCache = new HashMap<String, SoftReference<Drawable>>();
}
/** * 加载drawable,读取到drawable后用hashmap存起来,以图片地址为key,这样在重复加载的时候就可以直接取值了
* * @param imageUrl * @param imageCallback * @return drawable */
public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
if (imageCache.containsKey(imageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get();
if (drawable != null) {
return drawable;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
}
};
new Thread() {
@Override public void run() {
Drawable drawable = loadImageFromUrl(imageUrl);
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
}.start(); return null;
}
/** * @param strUrl * @return drawable */
private static Drawable loadImageFromUrl(String strUrl) {
URL url; InputStream i = null;
try { url = new URL(strUrl);
i = (InputStream) url.getContent();
} catch (Exception e) {
e.printStackTrace();
}
Drawable d = Drawable.createFromStream(i, "src");
return d;
}
public interface ImageCallback {
/** 这个接口用来实现回调 * @param imageDrawable * @param imageUrl */
public void imageLoaded(Drawable imageDrawable, String imageUrl);
}
}</span>
这个类用到了SoftReference软引用,在内存不足的情况下自动释放缓存,不至于在加载图片过多的时候产生内存泄露。
然后自定义的Adapter的getView方法中这样加载图片:
<span style="font-size:16px;"></span>
<span style="font-size:16px;">
Drawable cachedImage = imageLoader.loadDrawable(AppMessageUrl.IMAGEURL + iconUrl, new ImageCallback() {
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
holder.imageView.setImageDrawable(imageDrawable);
}
});
if (cachedImage == null) {
holder.imageView.setImageResource(R.drawable.no_apk); //在图片没有读取出来的情况下预先放一张图
} else { holder.imageView.setImageDrawable(cachedImage);
}</span>
ListView与GridView异步加载图片的更多相关文章
- Android GridView异步加载图片和加载大量图片时出现Out Of Memory问题
我们在使用GridView或者ListView时,通常会遇到两个棘手的问题: 1.每个Item获取的数据所用的时间太长会导致程序长时间黑屏,更甚会导致程序ANR,也就是Application No R ...
- Android进阶:ListView性能优化异步加载图片 使滑动效果流畅
ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很 ...
- 【Android】ListView、RecyclerView异步加载图片引起错位问题
今天在RecyclerView列表里遇到一个情况,它包含300条数据,每项包含一个图片,发现在首次载入时,由于本地没图,请求网络的时候:快速滑动导致了图片错位.闪烁的问题. 原理的话有一篇已经说的很清 ...
- android listview 异步加载图片并防止错位
网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...
- ListView异步加载图片,完美实现图文混排
昨天参加一个面试,面试官让当场写一个类似于新闻列表的页面,文本数据和图片都从网络上获取,想起我还没写过ListView异步加载图片并实现图文混排效果的文章,so,今天就来写一下,介绍一下经验. Lis ...
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- Listview 异步加载图片之优化篇(有图有码有解释)
在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...
- Android 实现ListView异步加载图片
ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; ...
- 又优化了一下 Android ListView 异步加载图片
写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...
随机推荐
- opecv轮廓匹配,可以用于去噪
一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板. 矩 比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说 ...
- Eclipse User Library Add/Edit/Remove
1:前文 近来开发项目采用的技术是AngularJS+Bootstrap+Spring Boot+SpringMvc+JPA 的方式,创建的项目是 Java Project,对应的JAR文件需要添加到 ...
- alter table <表名 > add constraint <主键名>用法
alter table <表名 > add constraint <主键名>用法介绍 1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是分空 因为主键约束: ...
- 华为OJ平台——字符串匹配
题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true - 表示短字符串中所有字符均在长字符串中出现 false - ...
- asp.net(c#)中如何在前端用js写条件查询,且不用调用存储过程
前端页面(源): <dx:ASPxButton ID="ASPxButton_Select" runat="server" Text="查询&q ...
- Dynamic AX 4.0 用户组权限SecurityKey
UserId _userId = "IT001"; UserGroupId _userGroupId = "ABC_1"; DomainId _domainId ...
- frame和iframe的区别
转自:http://blog.csdn.net/lyr1985/article/details/6067026 CSDN 1.frame不能脱离frameSet单独使用,iframe可以 ...
- Oracle sqlldr使用示例
SQLLDR用于快速的批量导入数据, 示例步骤如下: 1.确定Oracle的连接示例 username/password@sid 我使用的是:system/world @ localorcl sid是 ...
- 005windows与Linux文件共享
基于网络的文件共享: 前提一:从windows能够ping通Linux: 前提二:关闭Linux防火墙,命令[/etc/init.d/iptables stop]: 方法一:通过WinSCP 步骤一: ...
- sqlserver监控阻塞(死锁)具体情况
公司sqlserver的监控系统主要是采用zabbix监控,但是zabbix的监控只能通过性能计数器给出报警,而无法给出具体的阻塞情况,比如阻塞会话.语句.时间等,所以需要配合sqlserver的一些 ...