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

ListView异步加载网络图片完美版之双缓存技术(续)

阅读更多
ListView异步加载网络图片完美版之双缓存技术

问题描述:以前对ListView加载网络图片以及缓存机制进行了分析,本来自以为已经完美了,前段时间有朋友说还有问题,问题是AsyncTask中的线程池满了>128。以前控制线程数量的方法是在ListView处于Fling状态的时候不去启动下载线程,然而这样的做法没有从更本上控制线程的数量。
解决方案:今天我将通过生产者消费者模式+信号量来控制AsynTask的执行。

// 通过信号量控制同时执行的线程数
	Semaphore mSemaphore = new Semaphore(50);

	// 这里是任务的消费者,去任务队列取出下载任务,然后执行,当没有任务的时候消费者就等待
	class Executor extends Thread {
		@Override
		public void run() {
			while (true) {
				ImageLoadTask task = null;
				try {
					task = mTasks.take();
					if (task != null) {
						mSemaphore.acquire();
						task.execute();
						task.cancel(true);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

public void loadImage(String url, BaseAdapter adapter, ViewHolder holder) {
		resetPurgeTimer();
		Bitmap bitmap = getBitmapFromCache(url);// 从缓存中读取
		if (bitmap == null) {
			holder.mImageView.setImageResource(R.drawable.ic_launcher);// 缓存没有设为默认图片
			ImageLoadTask imageLoadTask = new ImageLoadTask(url, adapter);
			try {
				//将任务放入队列中
				mTasks.put(imageLoadTask);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} else {
			holder.mImageView.setImageBitmap(bitmap);// 设为缓存图片
		}
	}


@Override
		protected void onPostExecute(Bitmap result) {
			mSemaphore.release();
			if (result == null) {
				return;
			}
			addImage2Cache(url, result);// 放入缓存
			adapter.notifyDataSetChanged();// 触发getView方法执行,这个时候getView实际上会拿到刚刚缓存好的图片
		}


总结:我本来还想了一种解决的办法就是,在ViewHold中保留一个AsynTask的引用,如果AsyncTask的状态为Running则将其cancle,但是没有cancle掉,希望知道的朋友解答一下。
分享到:
评论
4 楼 天若子 2013-10-30  
给力。。。
3 楼 messigoogle 2013-04-09  
WARN/System.err(1568): javax.net.ssl.SSLException: Connection closed by peer希望楼主有什么好的方法
2 楼 messigoogle 2013-04-09  
测试了下,还是会有WARN/System.err(1568): javax.net.ssl.SSLException: Connection closed by peer
1 楼 喜物悲己 2013-03-04  
   感谢楼主!!!

相关推荐

    listview 异步加载网络图片

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

    ListView异步加载网络图片

    总之,ListView异步加载网络图片是一项关键技术,它涉及到Android多线程、内存管理和图片缓存策略。合理地运用这些技术,可以构建出性能优良、用户体验良好的应用。同时,使用SoftReference可以平衡内存使用和图片...

    ListView异步加载图片

    然而,如果直接在ListView中加载网络图片,可能会导致应用性能下降,因为这会阻塞主线程,造成UI卡顿。为了解决这个问题,我们需要实现ListView的异步加载图片功能。本篇文章将详细介绍如何通过软引用缓存图片,实现...

    android listView图片异步加载(拖动时不加载,双缓存)

    通过以上步骤,我们可以实现一个高效的图片异步加载方案,确保ListView在滚动时保持流畅,同时充分利用双缓存策略降低网络请求频率,提升应用性能。在实际项目中,可以根据需求选择合适的第三方库,或者自定义实现以...

    Android实现ListView异步加载图片

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

    ListView异步加载图片进度条

    综上所述,实现ListView中的异步加载图片进度条,需要综合运用多线程、图片缓存、UI更新等技术,并遵循良好的代码组织和错误处理原则。通过合理的封装和接口设计,可以使得代码更加规范,同时也提升了用户体验。

    Android Listview异步加载图片

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

    android listView 异步加载图片

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

    listview异步加载网络图片

    总的来说,“listview异步加载图片”是一项关键的性能优化技术,它结合了异步编程和内存管理的策略,确保了ListView的流畅滚动和系统的稳定运行。通过理解并应用这些知识,开发者可以创建出更高效、更用户友好的...

    listview异步加载.rar

    ListView是Android平台上常见的一种用于展示大量数据的视图组件,尤其在处理长列表时,它的异步加载机制显得尤为重要。异步加载是为了提高用户体验,避免因加载大量数据而导致UI线程阻塞,使得应用程序响应变慢甚至...

    Android中ListView全面完美的网络图片的异步加载

    综上所述,实现Android中ListView全面完美的网络图片异步加载需要结合异步加载库(如Picasso或Glide)、LruCache缓存策略以及动态加载技术。这些方法的运用可以显著提升应用性能,为用户提供流畅的滚动体验,同时...

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

    然而,当ListView中的每个项都需要加载网络图片时,如果处理不当,可能会导致应用性能下降,用户体验变差。本实例将详细讲解如何实现“Android ListView异步加载图片”,结合线程池、数据库和本地保存来优化性能。 ...

    ListView的异步加载图片并缓存

    因此,"ListView的异步加载图片并缓存"是解决这一问题的关键技术。 异步加载图片的主要目的是将耗时的操作(如网络请求、图片解码)放在后台线程,以避免阻塞UI线程,提高用户体验。以下是一些关键知识点: 1. **...

    ListView异步加载网络图片之一

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

    Android ListView异步加载图片

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

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

    在Android应用开发中,图片异步加载是一种常见的优化技术,特别是在构建类似照片墙或ListView这样的大量图片展示场景中。这个话题主要关注如何有效地处理图片资源,避免UI阻塞,提高用户体验。以下是对"图片异步加载...

    ListView异步加载图片三级缓存

    总结起来,"ListView异步加载图片三级缓存"是一个重要的Android性能优化技巧,它结合了异步处理、内存管理、磁盘操作以及网络通信,为用户提供流畅、高效的图片浏览体验。在LazyLoaderDemo这样的示例代码中,我们...

Global site tag (gtag.js) - Google Analytics