`
heisedeyueya
  • 浏览: 97610 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

ListView异步加载网络图片之二

阅读更多
ListView异步加载网络图片之二

    上一篇文章中卖了一个关子,遗留下来两个bug,不知道有没有同学发现,或者已经解了,那么这一篇文章我将解决其中一个bug(呵呵继续卖。。。)
问题描述:当我们把列表向下滚动再向上滚动反复的操作,本来应该是iteye的logo和妮露(看死神的同学应该知道)交替显示的,但是悲剧却发生了,图片乱了。
问题产生的原因:由于listview中列表项的view是复用的,当后台返回图片,并执行onPostExecute方法中调用这一句mViewHolder.mImageView.setImageBitmap(result)的时候,他会影响到所有复用的item,而这个时候你的列表已经滚动了,所以你就看到图片显示不正常了。
问题解决方案:根据问题产生的原因,我们就不要在onPostExecute方法中去调用mViewHolder.mImageView.setImageBitmap(result)方法,那么我们应该在哪儿调用呢?这儿不调用,那么我们的imageview怎么知道图片已经下载好了呢?我们只需要调用adapter的notifyDataSetChanged()方法,他会触发getView方法的调用,而在getView方法中就直接去缓存中拿图片了(这样在屏幕可见范围的item都是正常的,不可见的无聊他显示神马我们都不用关心),所以在onPostExecute方法中我们只需要将下载好的图片放入缓存,并且通知adapter数据发生了变化。

class ImageLoadTask extends AsyncTask<Object, Void, Bitmap> {
		int position;

		@Override
		protected Bitmap doInBackground(Object... params) {
			String url = (String) params[0];
			position = (Integer) params[1];
			Bitmap drawable = ImageLoader.loadImage(url);// 获取网络图片
			return drawable;
		}
		@Override
		protected void onPostExecute(Bitmap result) {
			if (result == null) {
				return;
			}
			/**
			 * 由于列表项的view是复用的,所以所有复用的view的图片都会被改变
			 */
			//mViewHolder.mImageView.setImageBitmap(result);
			cacheImage(position, result);// 放入缓存
			/**
			 * 通知数据发生改变,会触发adapter的getView方法调用
			 * 将视图的更新统一到getView方法去调用,因为我们只需要关心屏幕内的内容
			 * 屏幕中看不到的内容我们是不需要去调用setImageBitmap这个方法的
			 */
			notifyDataSetChanged();
		}
	}

总结:说了这么多,我也不知道看这篇文章的同学能不能够看懂,这个问题还是挺绕的,我的文字表达能力很有限。如果不明白的可以单聊。当然这个bug是解决了,还有一个更严重的bug,可以直接让我们脆弱的demo崩掉,不信你试一试,预知详解,敬请关注下一期博客
分享到:
评论
1 楼 gao4263 2013-04-21  
大量图片的缓存会造成内存的泄露的
private Bitmap[] images;        是不是应该用软应用

相关推荐

    listview 异步加载网络图片

    10. **总结**:在Android的ListView中实现异步加载网络图片,需要结合异步处理框架、选择合适的图片库、优化缓存策略、合理管理内存,并对ListView进行优化。通过这些手段,可以显著提升应用的性能和用户体验。

    ListView异步加载网络图片

    因此,"ListView异步加载网络图片"是一个重要的优化技巧。 异步加载的基本思路是将图片下载和显示的操作放在后台线程进行,避免占用主线程资源,确保UI的流畅。在Android中,可以使用多种方式实现这一目标,例如...

    ListView异步加载图片

    2. 实现异步加载:使用AsyncTask或其他异步框架(如Handler、Loader)来下载和解码图片。在后台线程中,先检查图片是否已存在于缓存中,如果存在,直接返回;否则,从网络下载图片并解码后存入缓存。 3. 图片加载回...

    Android实现ListView异步加载图片

    "Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...

    ListView异步加载图片进度条

    二、异步加载图片的基本原理 1. 创建后台线程:通常我们会使用AsyncTask、Handler、Thread或者更现代的Loader、RxJava等异步处理工具来创建一个后台线程,用于下载或解码图片。 2. 图片缓存:为了减少网络请求和...

    ListView异步加载网络图片之一

    在“ListView异步加载网络图片之一”这篇博文中,作者可能讨论了以下几点: 1. **异步加载原理**:使用AsyncTask、Handler、Thread、Runnable或者第三方库如Volley、Picasso、Glide等来在后台线程下载图片,下载...

    listview异步加载网络图片

    为了解决这个问题,我们需要采用异步加载策略,并合理管理内存,这就是“listview异步加载图片”的核心概念。 异步加载图片的基本思路是在后台线程下载和处理图片,然后在UI线程更新ListView的项。这样可以避免主线...

    android listView 异步加载图片

    这里的“android listView 异步加载图片”指的是在不阻塞UI线程的情况下,从网络、本地存储或其他来源加载图片到ListView中的技术。 这篇名为“ImageLoader”的Java文件很可能就是一个实现图片异步加载的工具类。在...

    listview异步加载.rar

    在本压缩包文件"listview异步加载.rar"中,我们很可能会找到关于如何实现ListView异步加载的相关资料。 在Android中,ListView的异步加载通常涉及以下几个关键知识点: 1. **Adapter**:Adapter是连接ListView与...

    Android Listview异步加载图片

    为了解决这个问题,我们需要实现ListView的图片异步加载。本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时...

    android listview异步加载图片实例(线程池+数据库+本地保存)

    本实例将详细讲解如何实现“Android ListView异步加载图片”,结合线程池、数据库和本地保存来优化性能。 首先,我们需要理解异步加载的概念。在Android中,由于主线程负责用户界面的更新,因此不应在主线程中执行...

    Android ListView异步加载图片

    Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...

    Android实现Listview异步加载网络图片并动态更新的方法

    本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法。分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片、店名、活动详情、地址、电话和...

    图片异步加载,照片墙,异步加载listview图片2

    以下是对"图片异步加载,照片墙,异步加载listview图片2"这一主题的详细解释。 1. 图片异步加载的重要性: 在移动设备上,如果图片资源直接在主线程中加载,可能会导致应用卡顿或ANR(Application Not Responding...

    ListView异步加载网络大图Demo

    这篇教程"ListView异步加载网络大图Demo"主要讲解如何高效地在ListView中异步加载网络图片,以避免性能问题。 首先,我们需要理解Bitmap对象在Android中的内存管理。Bitmap是Android用来存储像素信息的类,占用大量...

    listview异步加载图片

    2. **图片请求**:在ListView的适配器中,对每个ImageView调用异步加载方法,传入图片URL。 3. **异步加载**:在后台线程下载图片,先检查内存缓存,有则直接返回;无则查看磁盘缓存,有则读取并存入内存缓存后返回...

Global site tag (gtag.js) - Google Analytics