我需要帮助设计针对长时间运行的后台任务的特定问题的解决方案。
背景:
- 我有一个应用程序,其 Activity 可显示文件列表。
- 每个文件都可以下载。每个下载的文件都可以有更新。
- 更新(如果有)将通过“立即更新”按钮作为通知触发。该应用有一个 Activity,可显示每个文件的更新。
- 在任一位置点击“立即更新”都会触发后台作业下载文件并更新这两个位置的 UI 进度(取决于用户所在位置)。
- 用户最多可以同时更新/下载 4 个文件。
设计:
- 我使用 WakefulBroadcastReceiver 设置了 GCM,它会启动 IntentService 来通知任何更新。
- 更新/下载是可运行的 - DownloadRunnable.java
- 作为一个单例类,MyDownloadManager 有一个静态方法 startDownload(),它可以使用特定的 url 启动 DownloadRunnable。
问题:
- 如何在下载更新时更新通知和 Activity 的进度?
- 如何扩展设计以运行并发下载并将进度更新到相应的项目?
最佳答案
- 我会将下载任务移至服务中。
- 我不会自己实现它,而是使用 DownloadManager System 服务,请参阅 doc和 usage example .
- 在您的用户界面中,您可以查询后台线程内的下载状态,请参阅此问题:Show Download progress inside activity using DownloadManager 。与我使用 AsyncTask 的解决方案不同相反。
这允许您并行执行下载。在 Activity 中,您可以通过在后台线程中轮询来显示当前进度,但我不确定您的通知是什么意思?下载管理器在开始下载时显示通知。
您的下载将比使用自己的实现更加稳定,因为 DownloadManager 可以处理连接丢失并执行重试。
关于java - Android:并发后台作业的设计(Service、IntentService 还是 AsyncTask?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22871580/