Job Scheduler vs Runnable:下行?

时间:2018-06-07 03:06:13

标签: android android-service

对于定期后台任务,我发现经常使用JobScheduler。或者,对于稍微(?)不同的用例,还有JobServiceAlarmManager。但为什么不开始新的Runnable呢?使用Runnable进行后台任务的缺点是什么? Runnable在闲置时会使用更多资源吗?

1 个答案:

答案 0 :(得分:13)

除了提供名为Runnable的单个方法之外,

run是一个除此之外什么也不做的接口。也许您想知道HandlerThreadThreadAsyncTaskExecutorServiceJobSchedulerIntentServiceAlarmManager的使用方式?

以下是Android线程备忘单:

  • Runnable:一个不依赖于任何内容但在与许多其他线程相关类进行交互时使用的接口
  • Thread:从进程的主线程运行代码的最基本的方法。
  • AsyncTask:基于Android的中心方式从主线程运行代码,有一个专门用于所有AsyncTask实例的线程,因此在您的进程中一次只能运行一个
  • HandlerThread:在主线程和另一个线程之间发送消息(可能有延迟)的便捷方式
  • ExecutorService:强大的线程池,允许您利用多个CPU核心
  • Service(Android):一个没有用户界面但其方法仍然在主线程上运行的android组件
  • IntentService:你可以扩展的一个android服务子类,它包含一个后台线程,在该线程上可以完成没有相关活动的工作
  • AlarmManager:Android系统提供的一种机制,用于在特定时间启动Android组件,但会在重启时忘记所有内容
  • JobScheduler:由Android系统提供的Lollipop及以上机制,根据要完成的工作的描述启动Android服务,并且可以选择在重新启动时保留配置(现在更喜欢WorkManager)
  • WorkManager:Android架构组件(Google提供的库,可在许多Android版本上运行),其工作方式与JobScheduler类似,但还可以协调多个作业

Android操作系统如何管理流程和线程:

在选择线程机制时,了解Android OS如何管理应用程序非常重要。 Android操作系统可以看到应用程序中的应用程序和组件(ActivityServiceBroadcastRecieverContentProvider)。高级Android操作系统不知道应用程序内部的线程。

与台式计算机上的应用程序不同,Android OS中安装的应用程序进程具有更加模糊的生命周期。例如,如果你启动计算器app,Android会为它创建一个linux进程。如果你离开计算器,它通常不会立即杀死计算器进程。如果您开始使用许多其他应用程序并且长时间不返回计算器,它最终可能会决定回收计算器进程使用的内存并结束该进程。即使进程存在,用户也可能让手机进入休眠状态,CPU将停止执行所有进程中的所有线程,直到CPU再次唤醒为止。唤醒锁可以防止CPU睡眠。像WorkManager这样的机制可以为你处理唤醒锁。

这在实践中意味着你可以从Activity中剥离线程,只要进程处于活动状态,线程不会暂停或停止,它们就可以继续使用它们自己的生命。即使Activity可能正在接收这些生命周期回调,Android操作系统也是如此。但是,当Android决定结束您的进程时,所有线程也会死亡。作为应用开发者的唯一方法是告知Android它不应该杀死你的过程是创建一个Service,甚至可能使它成为前景Service,以便Android知道重要的事情发生在您的应用,或者使用WorkManager,因为Android知道这一点(在幕后它可能是Service ...)。当使用Service时,您仍然需要分离某种线程来完成您的工作,因为Service函数在您的进程的主线程上执行,除非您通过IPC binder调用接收消息,那些运行在16个绑定线程池上的,如果它们是通过IPC而不是本地调用的,那么ContentProvider方法也是如此。

以下是一些可帮助您决定使用内容的问题:

  • 您是否正在执行与用户正在屏幕上直观地与之交互的活动直接相关的任务?

考虑HandlerThreadAsyncTaskExecutorService

  • 您是在后台播放音乐还是其他用户希望通过通知控制的内容?

考虑ServiceHandlerThread或类似的东西配对。

  • 您是否正在执行需要迟早发生的任务,但目前与屏幕上发生的事情没有直接关系?

考虑WorkManagerAlarmManagerIntentService

  • 如果用户在您的任务即将开始时立即关闭其设备,您是否要在重新启动设备时再试一次?

考虑WorkManager

一如既往,最好直接从源头获取此类信息。例如,https://developer.android.com/topic/libraries/architecture/workmanager谷歌说:

  

注意:WorkManager适用于需要保证的任务   即使应用程序退出,系统也会运行它们,例如上传应用程序   数据到服务器。它不适用于进行中的后台工作   如果应用程序进程消失,可以安全终止;对于   在这种情况下,我们建议使用ThreadPools。

有关此类更多提示,请阅读https://developer.android.com/

上的javadoc和指南