【问题标题】:How to use AsyncTask with ThreadPoolExecutor如何将 AsyncTask 与 ThreadPoolExecutor 一起使用
【发布时间】:2011-09-12 03:05:44
【问题描述】:

我对 ThreadPoolExecutor 有点困惑。这是我想要完成的任务:

我有一个列表视图,左边有一个图像图标,右边有一个简短的描述。我已经静态定义了所有文本,但是我想从网上获取图标。我已经知道如何从 url 获取图像,但是我不想为每个图标生成“n”个线程来获取图标图像。所以我阅读了线程池执行器的异步任务,但我不知道该怎么做。你们能给我一个先机吗?我必须创建一个线程池执行程序并在其中使用异步任务吗?

我的列表是这样的……没有图标。

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

【问题讨论】:

    标签: android threadpool android-asynctask


    【解决方案1】:

    我建议只使用 AsyncTask 而不必担心ThreadPoolExecutor,它无论如何都需要 HoneyComb。 AsyncTask 有一个线程池,可用于所有列表项。它不会为每个图标创建一堆线程。

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

    【讨论】:

    • 当我在异步任务中执行 Log.d(TAG, "Created") 时,它显示创建了“n”个线程。那么您的意思是,即使它们是创建的,Async 也有一种内部方式来控制它的线程池?
    • 您需要为您拥有的每个任务创建一个新的 AsyncTask 实例并执行它。您不应该重用这些实例。 AsyncTask 管理一个线程池,所有任务共享该池。
    • @StevePrentice 根据文档,ThreadPoolExecutor 从 API 级别 1 开始可用。我觉得这是最好的解决方案。
    • @Dheeraj,AsyncTask 直到 api 级别 3 才可用,而 AsyncTask.exexcuteOnExecutor 直到 api 级别 11(蜂窝)才可用。
    【解决方案2】:

    您需要使用方法executeOnExecutor() 以您自己的执行程序启动它。

    似乎有很多陷阱,所以请仔细阅读整页AsyncTask

    是的,您可以创建自己的ThreadPoolExecutor 并将其与AsyncTask 一起使用。

    【讨论】:

    • 谢谢,我会进一步调查!看起来很烦人..大声笑
    • 但是,这不适用于 11 以下的 API 级别
    猜你喜欢
    • 2017-11-17
    • 2012-03-18
    • 2013-08-05
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多