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掉,希望知道的朋友解答一下。
分享到:
相关推荐
10. **总结**:在Android的ListView中实现异步加载网络图片,需要结合异步处理框架、选择合适的图片库、优化缓存策略、合理管理内存,并对ListView进行优化。通过这些手段,可以显著提升应用的性能和用户体验。
总之,ListView异步加载网络图片是一项关键技术,它涉及到Android多线程、内存管理和图片缓存策略。合理地运用这些技术,可以构建出性能优良、用户体验良好的应用。同时,使用SoftReference可以平衡内存使用和图片...
然而,如果直接在ListView中加载网络图片,可能会导致应用性能下降,因为这会阻塞主线程,造成UI卡顿。为了解决这个问题,我们需要实现ListView的异步加载图片功能。本篇文章将详细介绍如何通过软引用缓存图片,实现...
通过以上步骤,我们可以实现一个高效的图片异步加载方案,确保ListView在滚动时保持流畅,同时充分利用双缓存策略降低网络请求频率,提升应用性能。在实际项目中,可以根据需求选择合适的第三方库,或者自定义实现以...
Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念进行解释。 1. 异步加载图片的必要性 ...
综上所述,实现ListView中的异步加载图片进度条,需要综合运用多线程、图片缓存、UI更新等技术,并遵循良好的代码组织和错误处理原则。通过合理的封装和接口设计,可以使得代码更加规范,同时也提升了用户体验。
为了解决这个问题,我们需要实现ListView的图片异步加载。本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时...
这里的“android listView 异步加载图片”指的是在不阻塞UI线程的情况下,从网络、本地存储或其他来源加载图片到ListView中的技术。 这篇名为“ImageLoader”的Java文件很可能就是一个实现图片异步加载的工具类。在...
总的来说,“listview异步加载图片”是一项关键的性能优化技术,它结合了异步编程和内存管理的策略,确保了ListView的流畅滚动和系统的稳定运行。通过理解并应用这些知识,开发者可以创建出更高效、更用户友好的...
ListView是Android平台上常见的一种用于展示大量数据的视图组件,尤其在处理长列表时,它的异步加载机制显得尤为重要。异步加载是为了提高用户体验,避免因加载大量数据而导致UI线程阻塞,使得应用程序响应变慢甚至...
综上所述,实现Android中ListView全面完美的网络图片异步加载需要结合异步加载库(如Picasso或Glide)、LruCache缓存策略以及动态加载技术。这些方法的运用可以显著提升应用性能,为用户提供流畅的滚动体验,同时...
然而,当ListView中的每个项都需要加载网络图片时,如果处理不当,可能会导致应用性能下降,用户体验变差。本实例将详细讲解如何实现“Android ListView异步加载图片”,结合线程池、数据库和本地保存来优化性能。 ...
因此,"ListView的异步加载图片并缓存"是解决这一问题的关键技术。 异步加载图片的主要目的是将耗时的操作(如网络请求、图片解码)放在后台线程,以避免阻塞UI线程,提高用户体验。以下是一些关键知识点: 1. **...
在“ListView异步加载网络图片之一”这篇博文中,作者可能讨论了以下几点: 1. **异步加载原理**:使用AsyncTask、Handler、Thread、Runnable或者第三方库如Volley、Picasso、Glide等来在后台线程下载图片,下载...
Android 异步加载图片,对ListView的异步加载图片的功能演示,主要根据url读取图片返回流的方法。为了方便演示,将请求图片的链接先固定,每读取好一个图片就更新,界面比较简单,当然你可以做成比较好的,像很多好...
在Android应用开发中,图片异步加载是一种常见的优化技术,特别是在构建类似照片墙或ListView这样的大量图片展示场景中。这个话题主要关注如何有效地处理图片资源,避免UI阻塞,提高用户体验。以下是对"图片异步加载...
总结起来,"ListView异步加载图片三级缓存"是一个重要的Android性能优化技巧,它结合了异步处理、内存管理、磁盘操作以及网络通信,为用户提供流畅、高效的图片浏览体验。在LazyLoaderDemo这样的示例代码中,我们...