2017-08-12 97 views
0

该课题的总方向选择在Android的API级别15

后台作业对于这个问题,认为作业管理的一个网页浏览器需要下载网站,图片做的,和其他可能的内容向用户显示。从技术上讲,这与我所面临的情况非常相似。我要求我有选择(AsyncTaskService,第三方库,...)来实现这样的作业管理。

详细

我正在开发的Android应用程序,它需要下载的东西在后台,每当更多的数据可以从运行下载更新UI。
当用户选择时,他导航到他的愿望的另一个Activity。之前下载的数据对于新的Activity并不重要。因此需要停止第一次下载(为了下载新的带宽而腾出带宽),并且需要开始新的下载新的Activity。典型的下载时间将在几秒到半分钟之间完成。

当用户导航回第一Activity,第一次下载,不得从头开始。相反,它应该恢复。 当前Activity的下载完成,但还有其他最近的下载没有完成时,它们应该继续,以便用户导航到那些需要该数据的其他活动时,它可以立即呈现。即使应用程序进入后台,甚至每天定期进行一次,下载仍会继续,因此应用程序即使在脱机状态下也可以合理地提供最新的内容。

我有什么选择可以在API级别15进行这样的作业管理?请记住,这是关于作业管理/调度,而不是下载。下载东西相当容易编程,但调度是困难的部分。要求

摘要:

  • 取消/暂停工作(因此取消下载)
  • 观察员大干快上的工作进展情况通知
  • 数据必须是部分访问
  • 可恢复工作(读:可恢复的下载;创建一个新的恢复下载的工作当然是好的)
  • 作业可以在app不在前台时运行

选择我想过

AsyncTask
我认为这是不适合的,因为它绑定到活动,所以这是一个错误有在后台此运行而应用程序是不是在前景。根据Asking an IntentService for information about its queue,不可能改变IntentService的队列。

Service
到目前为止,我认为需要重写从头调度机制,或基于它的IntentService的源代码等建议通过上述SO回答。

回答

1

即使应用程序进入后台甚至定期进行一次说明,应用程序仍会继续下载,因此即使在离线状态下,应用程序也已准备好提供合理的最新内容。

这是一个不平凡的观点。这意味着您需要某种进程外调度组件,它在API 15级上意味着AlarmManager。这导致在Android的新版本的问题,所以我会建议之一:

  • 使用包装库像android-job一刀切,或

  • 使用ThreadPoolExecutorService处理实际的下载,并使用android-job触发该服务下载的事情,需要定期下载

取消/暂停作业(因此取消下载)

我的两个选项都支持取消作业。你将不得不发明自己的“暂停”机制。

观察员大干快上的工作进展

通知恕我直言,这无关与作业管理/调度。您将结束使用某种事件总线(greenrobot的EventBus,LocalBroadcastManager,基于RxJava的总线,基于MutableLiveData的总线等)。

数据必须是在部分

恕我直言访问,这无关与作业管理/调度。我不确定它是否实用,取决于您的网络使用情况。

可恢复工作(读:断点续传下载;创建一个新的工作为恢复下载就可以了,当然)

你可以使用我的两个选择创造就业机会。你将不得不建立自己的“可恢复”机制。

作业可以运行,而应用程序是不是在前台

这取决于你所说的“前台”的东西。如果通过“前景”,你的意思是“有一个活动是用户可见的”,那么我的两个选项都涵盖了这一点。但是,如果采用ThreadPoolExecutor方法,则您希望这是前景服务,就像在Android 8.0+上一样,未绑定的后台服务(例如,,其中一个由AlarmManager开始)只能运行约1分钟,并且总共下载量可能会超过这个数量。如果你使用android-job,那么它应该在Android 5.0+上使用JobScheduler,这样在开始出现问题之前,你会有更多的时间〜10分钟。

+0

感谢您分享您对各方面的看法,这有助于两种方式。现在我读了你的文章,我同意我的部分要求不是与工作管理相关的。因此,我现在也对问题有了更清晰的认识。 –