【问题标题】:Async task versus service to download data异步任务与下载数据的服务
【发布时间】:2015-04-08 17:03:24
【问题描述】:

我想知道下载文件、异步任务还是服务哪个更好?

我的应用程序有八个按钮,其中一个按钮启动一个不同的下载(其中下载有 ~10MB)。当用户点击一个或多个按钮下载数据时使用异步任务或服务更好?

谢谢!

【问题讨论】:

    标签: android android-asynctask android-service android-download-manager


    【解决方案1】:

    在任何情况下,您都应该使用AsyncTask,因为即使是服务也运行在不应该进行联网的主(GUI)线程中。是在服务还是活动中运行 AsyncTask 取决于您是否希望在后台继续下载。

    【讨论】:

    • 感谢@StenSoft,所以如果应用程序进入后台或用户更改为另一个活动,异步任务会停止吗?
    • 没有,但没有服务,整个应用程序可以在后台随时被系统杀死。
    • 嗯知道我明白我必须在哪个时刻使用!所以我将使用 AsyncTask。你解决了我的问题,感谢 StenSoft!
    • Service 在 UI 线程中运行,但 IntentService 使用它自己的线程。 IntentService 允许您在用户关闭应用程序的情况下继续下载,AsyncTask 非常适合用于短操作according to offical documentation。下载操作可能会很长,对我来说使用IntentService是一个更好的解决方案。
    【解决方案2】:

    以上所有答案都有好处。但是生命周期问题是您应该考虑的最重要的事情。例如,假设您使用asyncTask。所以用户开始下载,突然他/她旋转屏幕,因为你将asyncTask生命周期绑定到activity另一个asyncTask操作将被启动并导致强制下载10mb。因此考虑到这一点,您应该同时使用serviceasyncTask 来维护生命周期问题和UI 线程网络问题。

    update:Intent-service 是更好的解决方案,因为它在自己的线程中接收请求,并在无事可做时下线

    【讨论】:

      【解决方案3】:

      AsyncTask -- AsyncTask 操作线程和/或处理程序,如果您可以使用 Looper 做得更好的话,为什么还要麻烦? AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,理想情况下它应该用于短操作(最多几秒钟)。..在生产模式下如何判断是否不是会花很长时间?可能是网络不好、网络速度慢、网络阻塞、手机重启——所有这些都可能使您的下载损坏或未完成..我是应用程序的用户,当我什么都不用浪费捆绑包时我会生气..

      如果你问我,请使用

      服务 --Service不管什么应用程序/屏幕是可见的都运行,如果只有它可用,如果不继续下载并保存它,则与 UI 通信,AsyncTask 不构成通用线程框架。总是使用线程,它很酷,我们都喜欢它。

      【讨论】:

        猜你喜欢
        • 2016-11-23
        • 2018-07-01
        • 2015-10-08
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多