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异步加载图片

时间: 2024-08-06 11:56:23

ListView与GridView异步加载图片的相关文章

Android进阶:ListView性能优化异步加载图片 使滑动效果流畅

ListView 是一种可以显示一系列项目并能进行滚动显示的 View,每一行的Item可能包含复杂的结构,可能会从网络上获取icon等的一些图标信息,就现在的网络速度要想保持ListView运行的很好滚动流畅是做不到的 所以这里就需要把这些信息利用多线程实现异步加载 实现这样功能的类 [java] view plaincopy public class AsyncImageLoader { private HashMap<String, SoftReference<Drawable>&

【Android】ListView、RecyclerView异步加载图片引起错位问题

今天在RecyclerView列表里遇到一个情况,它包含300条数据,每项包含一个图片,发现在首次载入时,由于本地没图,请求网络的时候:快速滑动导致了图片错位.闪烁的问题. 原理的话有一篇已经说的很清楚了,大家可以参考下 下面是讲讲实际使用中,是怎么解决错位的问题. 一般错位都是发生在耗时的http请求上面,因此,针对每次图片请求 发起前 1:先将图片预设为本地一个占位图片.(重要!很多错位情况在于复用了其他位置的图片缓存,而当前图片迟迟加载不出来,导致当前图片错位.所以解决之道是先用本地占位图

android开发干货:实现listview异步加载图片

针对listview异步加载图片这个问题,麦子学院android开发老师讲了一种非常实用的方法,麦子学院android开发老师说凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.

android listview 异步加载图片并防止错位

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

android listview 异步加载图片并防止错位+双缓存

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

Listview异步加载图片之优化篇

在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化.有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索个中奥秘,与诸君共赏… 贴张效果图先: 2013-2-1 17:25 上传 下载附件 (214.08 KB) 异步加载图片基本思想: 1.      先从内存缓存中获取图片显示(内

又优化了一下 Android ListView 异步加载图片

写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看了这篇文章而受到了启发. 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,

Android ListView异步加载图片乱序问题,原因分析及解决方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不

android listview异步加载图片错位,重复,闪烁分析以及解决方案

我们在使用listview异步加载图片 的时候,在快速滑动或者网络不好的情况下,会出现图片错位,重复,闪烁等问题,其实这些问题总结起来就是一个问题, 比如listview上有100个item,一屏只显示10个item,我们知道getView()中converView是用来复用view对象的,因为一个item的view对象,而imageview控件就是view通过findViewById()获得的,而我们在复用view对象时,也就是说这个imageview也被复用了,比如第11个item的view