Android线程化位图工厂图像解码

Android线程化位图工厂图像解码,android,multithreading,image-processing,asynchronous,Android,Multithreading,Image Processing,Asynchronous,我们的Android应用程序进行了大量的图像解码。我们从互联网、本地存储缓存等获取大量图像 到目前为止,这些图像正在UI线程上解码(使用BitmapFactory.decodeX()方法)。它导致了一些超时崩溃,因为UI对用户输入的响应不够快 我可以编写一个封装解码的小异步任务,但我不确定这是个好主意。产卵线程是昂贵的,这将是产卵和撕毁他们吨 那么,把这个放到另一个线程上的最佳方式是什么?我是否需要达到编写服务的程度?那似乎有点重。已经有了解决方案吗?AsyncTask保留了一个线程池,因此使用

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

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

我可以编写一个封装解码的小异步任务,但我不确定这是个好主意。产卵线程是昂贵的,这将是产卵和撕毁他们吨


那么,把这个放到另一个线程上的最佳方式是什么?我是否需要达到编写服务的程度?那似乎有点重。已经有了解决方案吗?

AsyncTask保留了一个线程池,因此使用几个AsyncTasks实例不会花费太多成本。可以使用AsyncTask,也可以使用带有请求队列的单个线程来解码图像。

AsyncTask保留了一个线程池,因此使用几个AsyncTask实例不会花费太多成本。可以使用AsyncTask,也可以使用带有请求队列的单个线程来解码图像。

您可以使用
IntentService
来设置下载/解码,只需一次调用
startService()
,即可对每个图像执行一次。然后,您可以使用
ResultReceiver

将其传递回您的活动。您可以使用
IntentService
设置下载/解码,只需一次性为每个图像调用
startService()
,它就会一次执行一个操作。然后您可以使用
ResultReceiver

将其传递回您的活动,那么
IntentService
呢?是的,但它是一个简单的api,可以满足您的需要。@schwiz-您能在回答中重复一下吗?一个
IntentService
呢?是的,但这是一个简单的api,可以满足您的需要。@schwiz-您能在回答中重复一下吗?是的,我没有看过AsyncTask的代码,您可能认为他们会提到线程池。无论如何,看起来它仍然可以产生多达10个线程(yikes),这意味着在繁重的图像处理过程中,我将为上下文切换支付大量开销,从而降低单个图像的处理速度。因为我希望这些都是经过FIFO处理的,所以ImageService听起来会更高效。我喜欢AsyncTask,但我认为它更适合网络请求之类的事情。AsyncTask实际上是用来执行一次性操作的,例如在单击按钮之后。它不是通用的线程解决方案。另外,AsyncTask无意提及线程池,以避免提交到特定的实现。所有公平点。我确实认为指出具有巨大性能影响的实现细节是有道理的,但我接受你的观点。是的,我没有看过AsyncTask的代码——你可能认为他们提到了线程池。无论如何,看起来它仍然可以产生多达10个线程(yikes),这意味着在繁重的图像处理过程中,我将为上下文切换支付大量开销,从而降低单个图像的处理速度。因为我希望这些都是经过FIFO处理的,所以ImageService听起来会更高效。我喜欢AsyncTask,但我认为它更适合网络请求之类的事情。AsyncTask实际上是用来执行一次性操作的,例如在单击按钮之后。它不是通用的线程解决方案。另外,AsyncTask无意提及线程池,以避免提交到特定的实现。所有公平点。我确实认为指出具有巨大性能影响的实施细节是有道理的,并警告它们可能会改变,但我接受你的观点。作为记录,我们最终没有使用这个。对于这种类型的事情,它仍然比简单的异步任务要好。AsyncTask适用于阻塞但不执行密集计算的活动。问题是AsyncTask最多生成5个线程,队列10个任务,然后最多生成!!128!! 一旦队列已满,就执行线程。若你们同时运行30个图像解码任务,那个么再见应用程序,hello ANR crash。在上面,它执行线程池。最后,我们编写了一个AsyncTask的扩展,它有自己的队列,一次只允许运行一个任务。对于这种类型的事情,它仍然比简单的异步任务要好。AsyncTask适用于阻塞但不执行密集计算的活动。问题是AsyncTask最多生成5个线程,队列10个任务,然后最多生成!!128!! 一旦队列已满,就执行线程。若你们同时运行30个图像解码任务,那个么再见应用程序,hello ANR crash。在上面,它执行线程池。最后,我们编写了AsyncTask的扩展,它有自己的队列,一次只允许运行一个任务。