Android 作业调度程序与可运行程序:缺点?
对于定期的后台任务,我发现经常使用Android 作业调度程序与可运行程序:缺点?,android,android-service,Android,Android Service,对于定期的后台任务,我发现经常使用JobScheduler。或者,对于稍微不同的用例,还有JobService和AlarmManager。但是为什么不直接启动一个新的可运行的?在后台任务中使用Runnable有哪些缺点?Runnable空闲时是否会使用更多的资源?Runnable是一个接口,除了提供一个名为run的方法之外,它本身不做任何事情。也许您想知道与JobScheduler、IntentService和AlarmManager相比,如何使用HandlerThread、Thread、Asy
JobScheduler
。或者,对于稍微不同的用例,还有JobService
和AlarmManager
。但是为什么不直接启动一个新的可运行的?在后台任务中使用Runnable
有哪些缺点?Runnable
空闲时是否会使用更多的资源?Runnable
是一个接口,除了提供一个名为run
的方法之外,它本身不做任何事情。也许您想知道与JobScheduler
、IntentService
和AlarmManager
相比,如何使用HandlerThread
、Thread
、AsyncTask
、ExecutorService
这是一份Android线程备忘表:
Runnable
:一种接口,它本身不做任何事情,但在与许多其他线程相关类交互时使用
Thread
:从进程的主线程运行代码的最基本方式
AsyncTask
:基本的以Android为中心的方法在主线程外运行代码,有一个线程专门用于所有AsyncTask实例,因此在进程中一次只能运行一个实例
HandlerThread
:在主线程和另一个线程之间发送消息(可能有延迟)的便捷方式
ExecutorService
:功能强大的线程池,允许您利用多个CPU核
服务
(安卓):安卓组件,没有用户界面,但其方法仍在主线程上运行
IntentService
:您可以扩展的一个android服务子类,它包含一个后台线程,在该线程上可以完成无关联活动的工作
AlarmManager
:安卓系统提供的一种机制,用于在特定时间启动安卓组件,但在重新启动时会忘记一切
JobScheduler
:安卓系统提供的棒棒糖及以上机制,用于根据待完成工作的描述启动安卓服务,并可选择在重新启动时保留配置(现在首选WorkManager)
WorkManager
:一个Android架构组件(谷歌提供的库,运行在许多版本的Android上),其工作原理类似于JobScheduler,但另外还允许协调多个作业
Android操作系统如何管理进程和线程:
在选择线程机制时,了解Android操作系统如何管理应用程序是很重要的。Android操作系统可以在应用程序中查看应用程序和组件(活动
,服务
,广播接收器
和内容提供者
)。高级安卓操作系统不知道应用程序内部的线程
与台式计算机上的应用程序不同,安卓操作系统中安装的应用程序进程的生命周期更加模糊。例如,如果启动计算器应用程序,Android将为其创建一个linux进程。如果您离开计算器,它通常不会立即终止计算器进程。如果您开始使用许多其他应用程序,并且长时间不返回计算器,那么它可能最终决定回收计算器进程使用的内存并结束该进程。即使进程仍然存在,用户也可能让手机进入睡眠状态,CPU将停止所有进程中所有线程的执行,直到CPU再次唤醒。Wakelocks可以防止CPU睡眠。诸如WorkManager
之类的机制可以为您处理唤醒锁
这在实践中意味着,您可以从活动中剥离线程,只要进程处于活动状态,线程就可以继续运行,即使活动可能正在接收这些生命周期回调,Android操作系统也不会暂停或停止线程。然而,当Android决定结束您的进程时,您的所有线程也将死亡。作为一名应用程序开发人员,要让Android知道它不应该终止您的进程,唯一的方法是创建一个服务
,甚至可能将其设为前台服务
,以便Android知道您的应用程序中正在发生一些重要的事情,或者使用WorkManager
,因为Android知道这一点(引擎盖下可能是服务
…)。当使用服务
时,您仍然需要剥离某种线程来完成工作,因为服务
函数在进程的主线程上执行,除非您通过IPC绑定调用接收消息,这些调用在16个绑定线程池上运行,如果ContentProvider
方法是通过IPC而不是本地重新调用
这里有几个问题可以帮助您决定使用什么:
- 您是否正在执行一项任务,该任务直接与用户正在屏幕上直观地进行交互的活动有关
考虑HandlerThread
,AsyncTask
,或ExecutorService
- 您是在后台播放音乐还是用户希望通过通知控制的其他内容
考虑将服务
与手柄线程
或类似的东西配对
- 您是否正在执行一项早晚都需要执行的任务,但与屏幕上正在发生的事情没有直接关系
考虑使用IntentService
- 如果用户在您的任务即将开始时关闭了设备的电源,您想在设备重新通电时重试吗
考虑WorkManager
像往常一样,最好直接从客户处获取此类信息