Job Scheduler 与 Runnable:缺点?
Job Scheduler vs Runnable: Downsides?
对于周期性的后台任务,我看到经常使用JobScheduler
。或者,还有 JobService
和 AlarmManager
用于稍微(?)不同的用例。但为什么不直接启动一个新的 Runnable
呢?使用 Runnable
进行后台任务有什么缺点? Runnable
空闲时是否使用更多资源?
Runnable
是一个接口,除了提供一个名为 run
的方法外,它自己什么都不做。也许您想知道 HandlerThread
、Thread
、AsyncTask
、ExecutorService
与 JobScheduler
、IntentService
和 AlarmManager
的用法?
这是一个 Android 线程速查表:
Runnable
:一个接口,它自己什么都不做,但在与许多其他线程相关的交互时使用 类
Thread
:运行 关闭进程主线程的最基本方法。
AsyncTask
:以 Android 为中心的基本方式 运行 从主线程编写代码,有一个线程专用于所有 AsyncTask 实例,因此只有一个线程可以 运行 在您的过程中一次
HandlerThread
:在主线程和另一个线程之间发送消息(可能有延迟)的便捷方式
ExecutorService
:强大的线程池,让你可以利用多个CPU核心
Service
(Android): 一个 android 组件,它没有用户界面,但其方法仍然 运行 在主线程上
IntentService
:您可以扩展的 android 服务子类,它包含一个后台线程,可以在没有关联 Activity 的情况下完成工作
AlarmManager
:Android 系统提供的一种机制,用于在特定时间启动 Android 组件,但在重新启动时会忘记所有内容
JobScheduler
:Android 系统提供的 Lollipop 及以上机制,用于启动 android 基于对要完成的工作的描述的服务,并且可以选择在重新启动时保留配置(现在更喜欢 WorkManager)
WorkManager
:一个 Android 架构组件(由 Google 提供的库 运行 在 Android 的许多版本上都有),其工作方式类似于 JobScheduler但另外允许协调多个作业
AndroidOS如何管理进程和线程:
在选择线程机制时,了解 Android OS 如何管理应用程序很重要。 Android OS 查看应用程序和应用程序中的组件(Activity
、Service
、BroadcastReciever
和 ContentProvider
)。高层 Android OS 不了解应用程序内部的线程。
与桌面计算机上的应用程序不同,Android OS 中已安装的应用程序进程具有更加模糊的生命周期。例如,如果您启动计算器应用程序,Android 会为其创建一个 linux 进程。如果您离开计算器,它通常不会立即终止计算器进程。如果您开始使用许多其他应用程序并且长时间不 return 计算器,它可能最终决定回收计算器进程使用的内存并结束该进程。即使进程存在,用户也可以让 phone 进入睡眠状态,并且 CPU 将停止所有进程中所有线程的执行,直到 CPU 再次唤醒。唤醒锁可以防止 CPU 睡眠。 WorkManager
等机制可以为您处理唤醒锁。
这实际上意味着您可以从 Activity
中分离出线程,它们有自己的生命,只要进程处于活动状态,线程就不会暂停或停止通过 Android OS 即使 Activity
可能正在接收这些生命周期回调。然而,当 Android 决定结束你的进程时,你所有的线程也会死掉。作为应用程序开发人员,通知 Android 它不应终止您的进程的唯一方法是创建一个 Service
,甚至可能将其设为前台 Service
,以便 Android 知道您的应用程序中正在发生一些重要的事情,或者使用 WorkManager
因为 Android 知道这一点(在引擎盖下它可能是 Service
...)。使用 Service
时,您仍然需要分离某种线程来完成您的工作,因为 Service
函数在进程的主线程上执行,除非您通过 IPC 活页夹调用接收消息,那些 运行 在 16 个活页夹线程池上,如果它们是通过 IPC 而不是本地调用的,那么 ContentProvider
方法也是如此。
这里有几个问题可以帮助您决定使用什么:
- 您执行的任务是否直接与 Activity 用户当前在屏幕上进行的视觉交互有关?
考虑 HandlerThread
、AsyncTask
或 ExecutorService
- 您是在后台播放音乐还是用户希望通过通知控制的其他内容?
考虑将 Service
与 HandlerThread
或类似的东西配对。
- 您正在执行的任务迟早会发生,但与屏幕上正在发生的事情没有直接关系吗?
考虑 WorkManager
,或 AlarmManager
与 IntentService
- 如果用户在您的任务即将开始时关闭了他们的设备,您想在设备重新打开时重试吗?
考虑WorkManager
一如既往,最好直接从源头获取此类信息。例如 https://developer.android.com/topic/libraries/architecture/workmanager Google 表示:
Note: WorkManager is intended for tasks that require a guarantee that
the system will run them even if the app exits, like uploading app
data to a server. It is not intended for in-process background work
that can safely be terminated if the app process goes away; for
situations like that, we recommend using ThreadPools.
有关此类的更多提示,请阅读 https://developer.android.com/
上的 javadoc 和指南
对于周期性的后台任务,我看到经常使用JobScheduler
。或者,还有 JobService
和 AlarmManager
用于稍微(?)不同的用例。但为什么不直接启动一个新的 Runnable
呢?使用 Runnable
进行后台任务有什么缺点? Runnable
空闲时是否使用更多资源?
Runnable
是一个接口,除了提供一个名为 run
的方法外,它自己什么都不做。也许您想知道 HandlerThread
、Thread
、AsyncTask
、ExecutorService
与 JobScheduler
、IntentService
和 AlarmManager
的用法?
这是一个 Android 线程速查表:
Runnable
:一个接口,它自己什么都不做,但在与许多其他线程相关的交互时使用 类Thread
:运行 关闭进程主线程的最基本方法。AsyncTask
:以 Android 为中心的基本方式 运行 从主线程编写代码,有一个线程专用于所有 AsyncTask 实例,因此只有一个线程可以 运行 在您的过程中一次HandlerThread
:在主线程和另一个线程之间发送消息(可能有延迟)的便捷方式ExecutorService
:强大的线程池,让你可以利用多个CPU核心Service
(Android): 一个 android 组件,它没有用户界面,但其方法仍然 运行 在主线程上IntentService
:您可以扩展的 android 服务子类,它包含一个后台线程,可以在没有关联 Activity 的情况下完成工作AlarmManager
:Android 系统提供的一种机制,用于在特定时间启动 Android 组件,但在重新启动时会忘记所有内容JobScheduler
:Android 系统提供的 Lollipop 及以上机制,用于启动 android 基于对要完成的工作的描述的服务,并且可以选择在重新启动时保留配置(现在更喜欢 WorkManager)WorkManager
:一个 Android 架构组件(由 Google 提供的库 运行 在 Android 的许多版本上都有),其工作方式类似于 JobScheduler但另外允许协调多个作业
AndroidOS如何管理进程和线程:
在选择线程机制时,了解 Android OS 如何管理应用程序很重要。 Android OS 查看应用程序和应用程序中的组件(Activity
、Service
、BroadcastReciever
和 ContentProvider
)。高层 Android OS 不了解应用程序内部的线程。
与桌面计算机上的应用程序不同,Android OS 中已安装的应用程序进程具有更加模糊的生命周期。例如,如果您启动计算器应用程序,Android 会为其创建一个 linux 进程。如果您离开计算器,它通常不会立即终止计算器进程。如果您开始使用许多其他应用程序并且长时间不 return 计算器,它可能最终决定回收计算器进程使用的内存并结束该进程。即使进程存在,用户也可以让 phone 进入睡眠状态,并且 CPU 将停止所有进程中所有线程的执行,直到 CPU 再次唤醒。唤醒锁可以防止 CPU 睡眠。 WorkManager
等机制可以为您处理唤醒锁。
这实际上意味着您可以从 Activity
中分离出线程,它们有自己的生命,只要进程处于活动状态,线程就不会暂停或停止通过 Android OS 即使 Activity
可能正在接收这些生命周期回调。然而,当 Android 决定结束你的进程时,你所有的线程也会死掉。作为应用程序开发人员,通知 Android 它不应终止您的进程的唯一方法是创建一个 Service
,甚至可能将其设为前台 Service
,以便 Android 知道您的应用程序中正在发生一些重要的事情,或者使用 WorkManager
因为 Android 知道这一点(在引擎盖下它可能是 Service
...)。使用 Service
时,您仍然需要分离某种线程来完成您的工作,因为 Service
函数在进程的主线程上执行,除非您通过 IPC 活页夹调用接收消息,那些 运行 在 16 个活页夹线程池上,如果它们是通过 IPC 而不是本地调用的,那么 ContentProvider
方法也是如此。
这里有几个问题可以帮助您决定使用什么:
- 您执行的任务是否直接与 Activity 用户当前在屏幕上进行的视觉交互有关?
考虑 HandlerThread
、AsyncTask
或 ExecutorService
- 您是在后台播放音乐还是用户希望通过通知控制的其他内容?
考虑将 Service
与 HandlerThread
或类似的东西配对。
- 您正在执行的任务迟早会发生,但与屏幕上正在发生的事情没有直接关系吗?
考虑 WorkManager
,或 AlarmManager
与 IntentService
- 如果用户在您的任务即将开始时关闭了他们的设备,您想在设备重新打开时重试吗?
考虑WorkManager
一如既往,最好直接从源头获取此类信息。例如 https://developer.android.com/topic/libraries/architecture/workmanager Google 表示:
Note: WorkManager is intended for tasks that require a guarantee that the system will run them even if the app exits, like uploading app data to a server. It is not intended for in-process background work that can safely be terminated if the app process goes away; for situations like that, we recommend using ThreadPools.
有关此类的更多提示,请阅读 https://developer.android.com/
上的 javadoc 和指南