【问题标题】:What are my options for long running network processes on Android?对于 Android 上长时间运行的网络进程,我有哪些选择?
【发布时间】:2018-07-25 12:37:44
【问题描述】:

我正在开发一个 Android 应用,它有 3 种不同的网络使用案例。配置完成后,它需要执行一个潜在的长时间运行过程,将本地数据库与远程数据库同步。稍后,它需要检查远程数据库的更新并同步到本地数据库,但它们通常很小。

在第一次同步完成之前,主要活动无法真正使用。我想显示同步进度通知,和/或应用程序本身的进度指示器/活动(如果它在前台)。

同步后,您可以按需下载远程托管的 MP3。

对于用户启动的大型初始数据库同步、任何后续的按需 mp3 文件下载以及稍后计划的小型数据库同步,我应该使用哪些 Android 类/模式?我可以使用这些类中的任何一个在我的应用中显示进度通知和活动吗?

选项

对于我的 3 个用例,Android API 提供了这些类/接口:

  • DownloadManager - 这对于下载数据文件看起来非常有用,但我的应用程序的初始同步基本上只是解析多个 huge XML HTTP 响应。我不确定它是否适合。特别是因为我可以根据需要拆分 XML HTTP 响应,并且它已经被 Retrofit 封送。
  • JobIntentService/IntentService/JobScheduler - 这看起来像我应该用于初始同步,也可能是任何后续同步。我不完全确定它们之间的区别,但看起来JobIntentService 是推荐使用的。
  • SyncAdapter - 看起来对以后的更新很有希望,但我希望初始同步显示进度通知。这可以通过 SyncAdapter 实现吗?任何 mp3 下载都应立即排队并处理,因此这看起来并不适用。
  • AsyncTask - 根据文档,仅用于短期运行的进程,不认为它适用于我的使用。
  • Volley - 似乎不适用,因为我已经在使用 Retrofit。

建议用途

  • JobIntentService 用于初始同步和后续同步
  • DownloadManager 用于所有 mp3 下载
  • 也许,将来使用SyncAdapter 进行后续同步

这是一个好的方法吗?我对是否使用 SyncAdapter 犹豫不决,因为它似乎需要做更多的工作才能获得与 Job 相同的数据。

【问题讨论】:

  • 我已经浓缩了这个问题以回应接近投票。不知道为什么它被否决了。

标签: java android android-intent download android-download-manager


【解决方案1】:

如果您没有额外的 lib 依赖项,Rx java 可能是一个解决方案。 Rx 使在后台线程上运行长时间运行的工作变得容易。

示例可以在这里找到 https://piercezaifman.com/converting-an-asynctask-to-rxjava/

【讨论】:

  • 无效答案,因为链接不再有效
【解决方案2】:

为此使用 AsyncTask。并将其放在 Service 中。

【讨论】:

  • 您能否详细说明:为了什么(初始同步、文件下载或重新同步)?为什么在服务中? API 文档明确声明 AsyncTask 不应用于长时间运行的进程(超过几秒钟)。
  • 即使关联的应用程序关闭,长时间运行的方法也可以工作。只有服务可以做到这一点。现在下载要求它在单独的线程上运行。 AsyncTask 允许在单独的线程中运行而不挂起服务。将两者结合起来就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 2012-07-19
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多