我正在尝试为设备和网络上的图像创建一个懒惰的图像加载器,用于ListView
。 我在想如何使用和如何,一方面我可以使用一个线程来集中我的请求(总是运行,并且我可以附加一个视图和一个适配器,它将处理为我加载的图像),缓存我的已经加载的图像,并在我加载之前检查图像的可见性,所以我不会做不需要的工作。许多AsyncTasks产卵的AsyncTask性能问题。
我有另一个想法使用AsyncTask
像在论坛上的许多建议。但有一个缺点。我看到很多人使用new MyTask().execute(urls);
,如果我想开始加载并停止按需加载图像,则会出现问题。 如果我使用每个图像的异步任务,那么我需要为每个图像创建一个新的异步任务,这是很多“新”,我可以使用一个池,但是如果太多的异步任务卡住了,我仍然会创建大约150个-200 asyc任务,对我来说太多了......
你们认为什么?我认为,一个线程会在这里做一个更好的工作:
- 继续运行,直到被杀
- 尝试从队列中的作业,如果不工作,等待。
- 如果有工作可用,请获取并开始处理。
- 连续处理每个请求并阻塞该线程。
- 一旦继续'2'。
- 对于需要显示的视图,由适配器使用
startLoadingImage()
完成的每个排队都会创建一个新的作业并在等待锁上调用通知。
如果我想要多个并行GET \ POST请求,我可以使用线程池优化此代码。 此外,我正在缓存我已下载的图像\为下次访问时的快速加载而加载。这个想法是最小化GC并列出滞后。
这段代码绝对不错,但是如果我考虑一个带有图像的列表,它以未知的速度和批量加载它们(因为用户可以像他喜欢的那样快速或慢速地滚动),你会获得相对于你自己的线程创建的许多AyncTasks它会创建一次并入睡,直到你排入一个新对象为止,对于他来说这是一个更多的内存,但是如果你使用自己的池并避免在run()函数中创建新对象,那么它就是多余的,而不是GC。 – codeScriber
当我们重复使用现有的AsyncTasks时,将不会创建许多AsyncTasks。那么,实际上,当用户开始滚动时,它会重新创建一个新的缩略图,并且有一些缩略图可供检索......但这只是滚动开始时的一个分配问题。我从来没有喜欢睡觉线程和担心更多关于那些永不停止或重复的线程。 –
嘿,我刚刚发现你是对的,我为每个Uri创建了一个新的AsyncTask ...我将在此上工作。感谢您向我展示这一点。 ;-) –