【问题标题】:Download a small file in an Application-based thread or a Service-based thread?在基于应用程序的线程或基于服务的线程中下载小文件?
【发布时间】:2013-11-13 21:30:17
【问题描述】:

我相当肯定,使用 Service 和 AsyncTask 处理异步文件下载是标准做法。这样,您可以终止原始活动并继续您的快乐方式。但是,当您不需要 Service 的生命周期管理、远程进程通信或其他主要功能时,这似乎有点矫枉过正。

既然服务仍然是整个应用程序的同一进程和生命周期的一部分,为什么不简单地在应用程序的上下文中运行一个后台线程(相对于 Activity,虽然不一定在扩展的应用程序类中)?有什么理由说明这将是一个特别糟糕的主意吗?

【问题讨论】:

    标签: android service process android-asynctask download


    【解决方案1】:

    我相当肯定,使用 Service 和 AsyncTask 处理异步文件下载是标准做法。

    AsyncTaskService 中毫无用处,因为您没有理由在Service 中的主应用程序线程上做任何事情。使用IntentService 进行下载,因为它为您提供后台线程,并且在没有更多工作要做时自动停止。

    为什么不简单地在应用程序的上下文中运行一个后台线程...有什么理由说明这会是一个特别糟糕的主意吗?

    因为您的应用将不可靠。

    虽然很多人关注服务的独立生命周期,但这并不是您将服务用于此类事情的原因。您将服务用作操作系统的标志,表明您的进程仍在执行某些操作。

    一旦您不再处于前台,Android 可以随时随意终止您的进程。特别是在内存压力很大的情况下,这可能会在您的应用离开前台后的几毫秒内发生。

    但是,Android 通常优先于终止空进程(没有正在运行的活动或服务的进程)和仅活动进程,优先于包含正在运行的服务的进程。在这里,“一般”意味着带有服务的进程不会永远存在,但它们被快速终止的可能性要小得多。

    因此,使用IntentService 向操作系统发出信号,表明您仍在向用户提供价值(下载文件),并且它应该让您的进程保持独立,直到您的IntentService 停止(因为下载完成) 或者您的服务运行时间如此以至于它可能丢失了它的虚拟弹珠。

    Application不是Service。每个进程都有一个Application 实例。由Application“管理”下载是没有意义的——您也可以在任何Context 之外运行一个裸线程。而且,最重要的是,没有任何东西可以告诉操作系统您正在做任何有意义的事情,因此您的进程可以在您离开前台时立即终止。

    但是,当您不需要服务的生命周期管理、远程进程通信或其他主要功能时,这似乎有点矫枉过正。

    在清单条目之外编写IntentService 并不比编写AsyncTask 复杂得多。调用IntentService 并不比调用AsyncTask 复杂得多。

    【讨论】:

    • 谢谢!显然,我有点困惑。也完全忘记了 IntentServices。
    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多