【问题标题】:AsyncTask executed from Service (IntentService) and Activity - is there a difference?从 Service (IntentService) 和 Activity 执行的 AsyncTask - 有区别吗?
【发布时间】:2011-07-29 15:45:10
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: android android-asynctask intentservice


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我选择了 IntentService 选项,并且传输正在排队。在移动环境中,这似乎比并行上传/下载多个文件更稳定。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2011-11-13
      • 1970-01-01
      相关资源
      最近更新 更多