【问题标题】:Android - Threaded BitmapFactory image decodingAndroid - Threaded BitmapFactory 图像解码
【发布时间】:2010-10-15 18:56:21
【问题描述】:

我们的 Android 应用会进行大量图像解码。我们从互联网、本地存储缓存等获取大量图片。

到目前为止,这些图像正在 UI 线程上进行解码(使用 BitmapFactory.decodeX() 方法)。它导致了一些超时崩溃,因为 UI 对用户输入的响应速度不够快。

我可以编写一个封装解码的小 AsyncTask,但我不确定这是一个好主意。产生线程很昂贵,而且会产生并拆除大量线程。

那么,将它放在另一个线程上的最佳方法是什么?我需要达到编写服务的程度吗?这似乎有点重量级。是否已经有任何解决方案?

【问题讨论】:

  • IntentService 怎么样?是的,可能有点矫枉过正,但它是一个简单的 API,可以满足您的需求。
  • @schwiz - 你能在回答中重复一遍吗?

标签: android multithreading image-processing asynchronous


【解决方案1】:

AsyncTask 保留一个线程池,因此您无需为使用多个 AsyncTask 实例支付太多费用。使用 AsyncTask 或使用带有请求队列的单线程来解码图像。

【讨论】:

  • 是的,我没有看过 AsyncTask 的代码——你会认为他们会提到线程池。无论如何,看起来它仍然可以产生多达 10 个线程(yikes),这意味着在繁重的图像处理期间,我会为上下文切换支付大量开销,从而减慢单个图像的处理速度。由于无论如何我希望这些处理大致 FIFO,听起来 ImageService 会更有效。我喜欢 AsyncTask,但我认为它更适合网络请求之类的事情。
  • AsyncTask 确实是为了执行一次性操作,例如在单击按钮之后。它不是通用的线程解决方案。此外,AsyncTask 没有故意提及线程池以避免提交到特定的实现。
  • 所有公平点。我确实认为指出具有巨大性能影响的实现细节是有效的,但需要注意的是它们可能会改变,但我同意你的观点。
【解决方案2】:

您可以使用IntentService 来排队下载/解码,只需为每个图像一次调用startService(),它会一次完成一个。然后您可以使用 ResultReceiver 将其传递回您的活动

【讨论】:

  • 为了记录,我们最终没有使用这个。对于这种类型的事情,它仍然比普通的 AsyncTask 更好。 AsyncTask 适用于阻塞但不执行密集计算的活动。问题是 AsyncTask 最多产生 5 个线程,排队 10 个任务,然后最多产生 !!128!!队列满后线程。如果你一次运行 30 个图像解码任务,再见应用程序,你好 ANR 崩溃。从好的方面来说,它会进行线程池。最终,我们编写了 AsyncTask 的扩展,它有自己的队列,并且一次只允许一个任务运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 2015-05-23
相关资源
最近更新 更多