java - Android:并发后台作业的设计(Service、IntentService 还是 AsyncTask?)

标签 java android android-asynctask android-service android-intentservice

我需要帮助设计针对长时间运行的后台任务的特定问题的解决方案。

背景:

  • 我有一个应用程序,其 Activity 可显示文件列表。
  • 每个文件都可以下载。每个下载的文件都可以有更新。
  • 更新(如果有)将通过“立即更新”按钮作为通知触发。该应用有一个 Activity,可显示每个文件的更新。
  • 在任一位置点击“立即更新”都会触发后台作业下载文件并更新这两个位置的 UI 进度(取决于用户所在位置)。
  • 用户最多可以同时更新/下载 4 个文件。

设计:

  • 我使用 WakefulBroadcastReceiver 设置了 GCM,它会启动 IntentService 来通知任何更新。
  • 更新/下载是可运行的 - DownloadRunnable.java
  • 作为一个单例类,MyDownloadManager 有一个静态方法 startDownload(),它可以使用特定的 url 启动 DownloadRunnable。

问题:

  • 如何在下载更新时更新通知和 Activity 的进度?
  • 如何扩展设计以运行并发下载并将进度更新到相应的项目?

最佳答案

  1. 我会将下载任务移至服务中。
  2. 我不会自己实现它,而是使用 DownloadManager System 服务,请参阅 docusage example .
  3. 在您的用户界面中,您可以查询后台线程内的下载状态,请参阅此问题:Show Download progress inside activity using DownloadManager 。与我使用 AsyncTask 的解决方案不同相反。

这允许您并行执行下载。在 Activity 中,您可以通过在后台线程中轮询来显示当前进度,但我不确定您的通知是什么意思?下载管理器在开始下载时显示通知。

您的下载将比使用自己的实现更加稳定,因为 DownloadManager 可以处理连接丢失并执行重试。

关于java - Android:并发后台作业的设计(Service、IntentService 还是 AsyncTask?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22871580/

相关文章:

java - Arrays.sort() 如何改变传递给它的变量?

java - ArrayList 中的重复对象是对单个对象的引用?

android - 在Android Studio中找不到离线Gradle插件

java - 如何上传带有 Google Drive REST API v2 链接的文件

android - onStartJob 和 onStopJob 在 android 中无法运行后台线程

java - 在 Java 8 中创建内存泄漏

java - 尝试将int类型转换为string类型

安卓工作室 : call requires API Level 16 error

android - 从 AsyncTask 返回 ArrayList

java - AsyncTask已经完成