对于定期后台任务,我看到经常使用JobScheduler.或者,还有针对轻微(?)不同用例的JobService和AlarmManager.但为什么不开始新的Runnable呢?使用Runnable进行后台任务的缺点是什么? Runnable在闲置时是否会使用更多资源?
解决方法:
Runnable是一个除了提供名为run的单个方法之外,它本身不执行任何 *** 作的接口.也许您想知道如何使用HandlerThread,Thread,AsyncTask,ExecutorService与JobScheduler,IntentService和AlarmManager?
这是一个Android线程备忘单:
> Runnable:一个接口,它本身不做任何事情,但在与许多其他线程相关的类进行交互时使用
>线程:从进程的主线程运行代码的最基本的方式.
> AsyncTask:从主要线程运行代码的基本以AndroID为中心的方式,有一个专用于所有AsyncTask实例的线程,因此在您的进程中一次只能运行一个
> HandlerThread:在主线程和另一个线程之间发送消息(可能有延迟)的便捷方式
> ExecutorService:强大的线程池,允许您利用多个cpu核心
>服务(AndroID):一个没有用户界面但其方法仍然在主线程上运行的androID组件
> IntentService:你可以扩展的一个androID服务子类,它包含一个后台线程,在该线程上可以完成没有相关Activity的工作
> AlarmManager:AndroID系统提供的一种机制,用于在特定时间启动AndroID组件,但在重启时会忘记所有内容
> JobScheduler:由AndroID系统提供的Lollipop及以上机制,根据要完成的工作的描述启动AndroID服务,并且可以选择在重新启动时保留配置(现在更喜欢WorkManager)
> WorkManager:AndroID架构组件(Google提供的库,可在许多AndroID版本上运行),其工作方式与JobScheduler类似,但还可以协调多个作业
AndroID OS如何管理进程和线程:
在选择线程机制时,了解AndroID OS如何管理应用程序非常重要. AndroID OS可以看到应用程序中的应用程序和组件(Activity,Service,broadcastRecIEver和ContentProvIDer).高级AndroID *** 作系统不知道应用程序内部的线程.
与台式计算机上的应用程序不同,AndroID OS中安装的应用程序进程具有更加模糊的生命周期.例如,如果你启动计算器app,AndroID会为它创建一个linux进程.如果你离开计算器,它通常不会立即杀死计算器进程.如果您开始使用许多其他应用程序并且长时间不返回计算器,它最终可能会决定回收计算器进程使用的内存并结束该进程.即使进程存在,用户也可能让手机进入休眠状态,cpu将停止执行所有进程中的所有线程,直到cpu再次唤醒为止.唤醒锁可以防止cpu睡眠. WorkManager等机制可以为您处理唤醒锁.
这在实践中意味着你可以从他们拥有自己生命的活动中剥离线程,只要进程处于活动状态,线程就不会被AndroID *** 作系统暂停或停止,即使活动可能接收这些生命周期回调.但是,当AndroID决定结束您的进程时,所有线程也会死亡.作为应用程序开发人员通知AndroID它不应该杀死你的进程的唯一方法是创建一个服务,甚至可能使它成为一个前台服务,以便AndroID知道你的应用程序中正在发生的重要事情,或者使用自AndroID以来的WorkManager意识到这一点(在引擎盖下它可能是一个服务……).使用服务时,您仍然需要分离某种线程来执行您的工作,因为服务功能在您的进程的主线程上执行,除非您通过IPC绑定器调用接收消息,这些消息在16个绑定池上运行线程,如果通过IPC而不是本地调用ContentProvIDer方法,则相同.
以下是一些问题,可帮助您确定使用方法:
>您是否正在执行一项任务,该任务直接与用户正在屏幕上以可视方式进行交互的活动相关联?
考虑HandlerThread,AsyncTask或ExecutorService
>您是在后台播放音乐还是其他用户希望通过通知控制的内容?
考虑Service与HandlerThread或类似的东西配对.
>您是否正在执行需要迟早发生的任务,但与现在屏幕上发生的事情没有直接关系?
考虑使用IntentService的WorkManager或AlarmManager
>如果用户在您的任务即将开始时立即关闭其设备,您是否要在重新启动设备时再试一次?
考虑WorkManager
一如既往,最好直接从源头获取此类信息.例如https://developer.android.com/topic/libraries/architecture/workmanager谷歌说:
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/上的javadocs和指南
总结以上是内存溢出为你收集整理的android – Job Scheduler vs Runnable:下行?全部内容,希望文章能够帮你解决android – Job Scheduler vs Runnable:下行?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)