2011-06-09 46 views
12

我对ThreadPoolExecutor有点困惑。这是我想要实现的:如何使用AsyncTask与ThreadPoolExecutor

我有一个列表视图,它填充了左侧的图像图标和右侧的简短描述。我已经将所有文本静态地定义了,但是我想从网络上获取图标。我已经知道如何从url获取图像,但是我不想为每个图标产生“n”个线程来获取图标图像。所以我读了asynctask的threadpoolexecutor,我不知道如何去做。你们能给我一个开始吗?我是否必须创建一个threadpoolexecutor并在其中使用asynctasks?

我的清单是这样的..没有图标。

___________________________ 
[icon][a short description] 
____________________________ 
[icon][a short description] 
_____________________________ 
[icon][a short description] 
_____________________________ 
[icon][a short description] 
____________________________ 

回答

8

我会推荐使用AsyncTask,而不用担心ThreadPoolExecutor,它需要HoneyComb。 AsyncTask有一个线程池,将被重用于你的所有列表项。它不会为每个图标创建一堆线程。

请记住,您的任务将在Android 2.x上并行运行,并跟踪代码可能存在的任何同步问题。

+0

当我在我的异步任务中做Log.d(标记,“创建”)时,它显示创建了'n'线程数量。所以你说什么即使它们被创建,Async有一个内部的方法来控制它的线程池? – HAxxor 2011-06-10 02:46:15

+0

您需要为每个您拥有并执行的任务创建一个新的AsyncTask实例。你不应该重用这些实例。 AsyncTask管理线程池,所有任务共享该池。 – 2011-06-10 15:48:31

+4

@StevePrentice根据文档[ThreadPoolExecutor](http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html)从API级别1开始可用。我认为这是最好的解决方案。 – 2012-03-18 08:26:01

4

您将需要使用方法executeOnExecutor()来启动它与您自己的执行者。

似乎有一些陷阱,所以仔细阅读AsyncTask的整个页面。

所以是的,你可以创建你自己的ThreadPoolExecutor并与AsyncTask一起使用它。

+0

谢谢你生病了!看起来很讨厌使用..大声笑 – HAxxor 2011-06-09 23:56:51

+0

但是,这是不适用于低于11的API级别 – rallat 2014-05-09 22:43:06