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 我也是因为看 ...
随机推荐
- 运行时---关联Associated
关联:指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分 一.在类的定义之外为类增加额外的存储空间 使用关联,我们可以不用修改类的定义而为其对象增加存储空间.这在我 ...
- socket学习笔记——select与epoll函数的使用(linux)
select.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <u ...
- linux下的mysql乱码问题
1,承接上一随笔,因为我用的是rmp的两种反式. rpm -ivh MySQL-server-4.0.14-0.i386.rpm rpm -ivh MySQL-client-4.0.14-0.i386 ...
- python中set和frozenset方法和区别
set(可变集合)与frozenset(不可变集合)的区别:set无序排序且不重复,是可变的,有add(),remove()等方法.既然是可变的,所以它不存在哈希值.基本功能包括关系测试和消除重复元素 ...
- ionic ngcordova camera
拍照是經常用到的,所以記錄一下 拍照的代碼... 1. ionic start camera blankcd camera ionic platform add ios 2. 添加插件,這裏很熟悉.. ...
- Unity Js与C#脚本通信
将.js文件放到Standard Assets目录下,否则无法编译通过 CS_test.cs : using UnityEngine; using System.Collections; publ ...
- JS常用的设计模式(10)——模版方法模式
模式方法是预先定义一组算法,先把算法的不变部分抽象到父类,再将另外一些可变的步骤延迟到子类去实现.听起来有点像工厂模式( 非前面说过的简单工厂模式 ). 最大的区别是,工厂模式的意图是根据子类的实现最 ...
- Solaris桌面CDE
/usr/dt/bin:应用程序/usr/dt/lib:运行时共享库/usr/dt/config:默认系统配置文件/usr/dt/man:手册页/usr/dt/app-defaults:默认应用程序资 ...
- Java设计模式(Design Patterns In Java)读书摘要——第1章 绪论
为何需要模式 模式是做事的方法,是实现目标,研磨技术的方法.通俗点说,模式是为了解决某个行业的某个问题的有效的方法或技艺. 为何需要设计模式 为了提升代码的水准,是代码变得简洁而易用.模式是一种思想, ...
- MVC开发Markdown编辑器(1)
MVC markdown MVC开发Markdown编辑器(1) 前言 安装 解析 结束语 前言 想在近段时间通过mvc开发个人博客,编辑器希望是markdown风格的,这样写文字会很方便.首先先解决 ...