【问题标题】:Is Asynctask safe to use large downloads rather than thread? [closed]Asynctask 使用大型下载而不是线程安全吗? [关闭]
【发布时间】:2015-05-18 09:00:14
【问题描述】:

大多数人将 asynctask 用于长时间运行的操作而不是线程。

但是文档说:

AsyncTask 被设计成一个围绕 Thread 和 Handler 的辅助类 并且不构成通用线程框架。异步任务 理想情况下应用于短操作(几秒钟在 大多数。)如果您需要保持线程长时间运行, 强烈建议您使用由 java.util.concurrent 包,例如 Executor、ThreadPoolExecutor 和 未来任务。

我的问题是,如果不关心 ui 更新,当我使用 asynctask 进行长时间运行的后台操作时,我应该面对什么问题?

【问题讨论】:

标签: java android multithreading android-asynctask


【解决方案1】:

AsyncTask 与 Activity 的生命周期相关联,因此很容易在配置更改/其他事件中弄乱其状态。

就个人而言,我建议您使用 HTTP 库,例如 Ion 或类似的。它易于使用,并为您提供开箱即用的进度控制。

【讨论】:

    【解决方案2】:

    为了在 Android 应用程序中下载大量文件或执行许多异步且耗时的操作,我会使用以下元素:

    此外,Android 5 内置了所谓的JobScheduler,它的作用与 Android Priority Job Queue 类似,但如果你想支持 pre-Lollipop 设备,你应该选择第一个解决方案.

    如果您有单个任务并且不需要任务队列,则可以在 Service 中使用 RxJava 而不是 Android Priority Job Queue。

    【讨论】:

    • 注意:您不能只使用 Service 进行长时间操作。您应该在其中启动后台线程,否则将在 main/ui 线程中调用 Service 并锁定 UI。 developer.android.com/guide/components/services.html
    • 是的,你是对的。我写过我们应该在 Service 中使用 Android Priority Job Queue 或 RxJava。这些库能够在单独的线程中执行耗时的操作。 Service 是长时间运行的操作,它不依赖于 Activity 生命周期,但它不是在单独的线程中执行的。
    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2015-07-11
    相关资源
    最近更新 更多