3

从 Activity 或 IntentService 启动 AsyncSync 之间有什么区别吗?

我正在构建一个通过 http 下载和上传文件的应用程序。我为每次传输使用带有进度条的自定义通知布局。我选择并行传输或将它们放入队列中(您会推荐哪个选项?)。

对于带有队列的选项,我使用 IntentService,因此 Android 框架会为我将任务放入队列中。为了让它们并行,我使用 AsyncTasks。但是我从 IntentService 启动它们(也可以是 Service) - 这样做有什么意义吗?IntentService 在执行 AsyncTask 后立即终止,因此 AsyncTask 在没有任何“父级”的情况下运行。

如果我从 Activity 启动了那些 AsyncTask,转到主屏幕并且系统决定关闭这个 Activity 怎么办?它可以做到吗?AsyncTask 会存活下来吗?

这种情况下的首选方法是什么?

4

2 回答 2

1

AsyncTask 并不真正适合您担心在组件生命周期之外生存的事情(如果您需要向该组件发回消息)。如果您打算提供服务,我什至不会打扰 AsyncTasks。至于并行或队列,这实际上取决于许多不同的变量,但我当然不会让它完全并行用于任何数量的下载/上传。我会对并发传输的最大数量设置一些限制。

使用 IntentService 进行并行执行毫无意义——您已经注意到了这个问题。您正在进入 Android API 并未真正涵盖的领域。AsyncTask 和 IntentService 是很好的抽象,它们使多个场景变得简单,但许多任务的并行执行并不是其中之一。最好使用一些 Java 线程/并发类。看看ThreadPoolExecutor

于 2011-07-29T17:47:34.223 回答
0

首先是您的简单问题,只要父应用程序没有被杀死,AsyncTask 就会在后台继续存在。从 Activity 启动它会告诉系统,如果内存压力需要,它可以被杀死。系统也不认为它有一个可能被中断的长时间运行的进程。

开发指南Services在其“基础知识”标题下有一个很棒的信息框,用于说明您是否应该使用服务或活动。当系统资源再次可用时,活动不会获得服务获得的内存压力考虑或终止后重新启动。

如果您希望我为您拨打电话,请使用 IntentService。是并行还是串行或某种组合运行下载是一个艰难的决定,因为您必须考虑网络(Wifi 或蜂窝)、文件大小和其他系统资源。

于 2011-07-29T17:47:12.543 回答