代码之家  ›  专栏  ›  技术社区  ›  Daniel S.

android API级别15中的后台作业选择

  •  0
  • Daniel S.  · 技术社区  · 8 年前

    这个问题的大致方向

    对于这个问题,请思考web浏览器在下载网站、图像和可能的其他内容以向用户显示时需要执行的作业管理。从技术上讲,这与我面临的情况非常相似。我在问我有什么选择( AsyncTask , Service ,第三方库,…)来实现这样的作业管理。

    细节


    Activity 他的欲望。因此,以前下载的数据对新用户来说并不重要 活动 活动 需要启动。典型的下载时间在几秒到半分钟之间。

    当用户导航回第一个 活动 当下载当前 完成,但最近还有其他未完成的下载,应继续下载,以便用户导航到需要该数据的其他活动时,可以立即显示。即使应用程序进入后台,也应继续下载,甚至定期下载,例如每天一次,因此即使在离线时,应用程序也可以合理地呈现最新内容。

    对于API级别15的作业管理,我有什么选择?请记住,这是关于作业管理/调度,而不是下载。下载东西很容易编程,但调度是困难的部分。

    要求摘要

    • 观察员收到作业进度通知
    • 数据必须可以部分访问
    • 作业可以在应用程序不在前台时运行

    我想过的选择

    异步任务
    我认为这不合适,因为它绑定到活动,所以当应用程序不在前台时,在后台运行它是一个bug。

    IntentService
    Asking an IntentService for information about its queue 不可能更改IntentService的队列。

    服务
    到目前为止,我认为我需要从头开始重写一个调度机制,或者基于 IntentService公司

    1 回复  |  直到 8 年前
        1
  •  2
  •   CommonsWare    8 年前

    即使应用程序进入后台,也应继续下载,甚至定期下载,例如每天一次,因此即使在离线时,应用程序也可以合理地呈现最新内容。

    AlarmManager 。这会在较新版本的Android上产生问题,因此我建议:

    • 使用包装器库,如 android-job 全面,或

    • 使用 ThreadPoolExecutor Service 用于处理实际下载,并使用 触发该服务下载需要定期下载的内容

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

    嗯,这与作业管理/调度无关。你最终会使用某种事件总线(greenrobot的事件总线, LocalBroadcastManager ,一个基于RxJava的总线,一个 MutableLiveData

    嗯,这与作业管理/调度无关。我甚至不确定它是否实用,这取决于你在网络中使用的是什么。

    可恢复作业(阅读:可恢复下载;当然,创建新作业以恢复下载是可以的)

    作业可以在应用程序不在前台时运行

    这取决于你所说的“前景”是什么意思。如果“前台”的意思是“有一个用户可见的活动”,那么我的两个选项都涵盖了这一点。然而,如果你按照 线程池 方法,你会希望它是一个前台服务,就像在Android 8.0+上一样,是一个未绑定的后台服务(例如,由 全局定时器 )只能运行约1分钟,您的下载总量可能会超过该时间。如果你同意 ,它应该使用 JobScheduler