Android:设计并发后台作业(Service,IntentService或AsyncTask?)

时间:2014-04-04 19:33:16

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

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

背景:

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

设计

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

问题:

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

2 个答案:

答案 0 :(得分:3)

  1. 我会将下载任务移到服务中。
  2. 我不会自己实现,而是使用DownloadManager系统服务,请参阅docusage example
  3. 在您的用户界面中,您可以在后台线程中查询下载状态,请参阅此问题:Show Download progress inside activity using DownloadManager。与解决方案不同,我会使用AsyncTask代替。
  4. 这允许您并行执行下载。在活动中,您可以通过后台线程中的轮询显示当前进度,但我不确定您对通知的意思是什么? DownloadManager在下载开始时显示通知。

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

答案 1 :(得分:0)

我建议使用Android' DownloadManager。这是整个操作系统使用的下载管理器。使用ACTION_DOWNLOAD_COMPLETE完成下载后,您将收到广播。

试用本教程:

http://blog.vogella.com/2011/06/14/android-downloadmanager-example/