与标准的Android异步任务相比,Java.util.concurrent库更擅长执行任何类型的任务吗

与标准的Android异步任务相比,Java.util.concurrent库更擅长执行任何类型的任务吗,java,android,multithreading,java.util.concurrent,Java,Android,Multithreading,Java.util.concurrent,我知道您可以进行更多定制,但是否有性能(mem/speed)使用并发库类比只使用stock AsyncTask或只创建线程并调用run有什么好处?如果查看AsyncTask,您会发现它都是基于FutureTask和java.util.concurrent.中的其他类构建的 我认为使用AsyncTask更方便,而且纯粹的FutureTask只会带来一点点好处(如果有的话)。尽管您可以选择使用java.util.concurrent.*中的其他API来完成更复杂的任务。AsyncTask与桌面上的S

我知道您可以进行更多定制,但是否有性能(mem/speed)使用并发库类比只使用stock AsyncTask或只创建线程并调用run有什么好处?

如果查看
AsyncTask
,您会发现它都是基于
FutureTask
java.util.concurrent.
中的其他类构建的


我认为使用
AsyncTask
更方便,而且纯粹的
FutureTask
只会带来一点点好处(如果有的话)。尽管您可以选择使用
java.util.concurrent.*
中的其他API来完成更复杂的任务。

AsyncTask
与桌面上的
SwingWorker
相比更具可比性,而不是并发API。它在后台使用线程,但提供了帮助您在UI线程中与UI组件交互的方法。

主要是AsyncTask带来的易用性。这种工作模式,在后台运行这个方法,在UI线程上运行另一个方法对于可用性来说是非常好的(尽管我已经做了一些改进,通过创建一个AsyncTask的子类来简化异常处理)。我认为AsyncTask非常适合使用请求-响应类型调用服务。但是,并非所有类型的并发都对AsyncTask有效

现在,有些任务不适合AsyncTask。例如,如果要同时从服务器加载多个映像。AsyncTask可能不是最佳选项。例如,异步任务只能运行一次,不能重新启动。AsyncTasks拥有在其上运行后台方法的线程,该线程不能被重用或共享。因此,如果您有10个或20个映像,这意味着如果您使用异步任务,则需要创建10个或20个线程并关闭。或者一次加载所有图像,这意味着在通过20个单独的调用从服务器完全加载所有图像之前,用户界面不会更新。要么你为更好的UI响应支付更多的内存、资源等,要么你的UI为更低的开销支付代价。两者都不好

一个更好的选择是加载一个线程一次,发送几个轻量级作业给它运行,然后将它们发回UI线程。我创建了自己版本的AsyncTask,我称之为PipelineHandler,它创建一个线程,并运行发布到它的作业。这些作业与AsyncTask非常相似,它们有一个在UI线程外调用的方法,还有一个在UI线程上调用以执行更新的方法。这里的好处是,我可以利用单个线程来运行任意多个作业。我可以根据需要轻松地扩展为队列提供服务的线程,而无需更改任何配置选项。在封面下,它使用Java并发类执行器服务,但也利用处理程序提供在UI线程上运行某些内容的能力。因此,它将Java并发库和Android库结合在一起来构建它


因此,为了回答您的问题,我认为AsyncTask对于服务请求-响应类型的调用这样的一次性工作非常有用,但对于下载图像或下载文件这样的批处理则不适用,特别是当您必须同时进行多个调用时。Java并发库可以在帮助您执行这些类型的任务方面发挥作用,但由于它们只能解决一半的问题,即在线程上运行任务,因此受到限制。Java并发库适合于批处理作业的运行,但不适合与UI线程接口。因此,您必须经常将它们组合在一起才能得到解决方案。

这个软件包是为了在您需要完成繁重的线程/并行任务(或排队)时使用。如果你只需要做一些简单的背景任务,你应该坚持简单的:)