对于定期后台任务,我发现经常使用JobScheduler
。或者,对于稍微(?)不同的用例,还有JobService
和AlarmManager
。但为什么不开始新的Runnable
呢?使用Runnable
进行后台任务的缺点是什么? Runnable
在闲置时会使用更多资源吗?
答案 0 :(得分:13)
Runnable
的单个方法之外, run
是一个除此之外什么也不做的接口。也许您想知道HandlerThread
,Thread
,AsyncTask
,ExecutorService
与JobScheduler
,IntentService
和AlarmManager
的使用方式?
以下是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操作系统可以看到应用程序中的应用程序和组件(Activity
,Service
,BroadcastReciever
和ContentProvider
)。高级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
方法也是如此。
以下是一些可帮助您决定使用内容的问题:
考虑HandlerThread
,AsyncTask
或ExecutorService
考虑Service
与HandlerThread
或类似的东西配对。
考虑WorkManager
或AlarmManager
与IntentService
考虑WorkManager
一如既往,最好直接从源头获取此类信息。例如,https://developer.android.com/topic/libraries/architecture/workmanager谷歌说:
注意:WorkManager适用于需要保证的任务 即使应用程序退出,系统也会运行它们,例如上传应用程序 数据到服务器。它不适用于进行中的后台工作 如果应用程序进程消失,可以安全终止;对于 在这种情况下,我们建议使用ThreadPools。
有关此类更多提示,请阅读https://developer.android.com/
上的javadoc和指南