当前位置:网站首页>到底使用Thread还是Service?
到底使用Thread还是Service?
2022-06-22 17:54:00 【刘忆初】
上篇文章中我们说过Threa和Service没有任何关系。也基本上解释了他们的区别,但是深度上还不够,这篇文章我们继续探讨thread和Service!
先说说Thread和Service的一些区别:
Thread:Thread (线程)是程序执行的最小单元,可以用 Thread 来执行一些异步的操作。
Thread 的运行是独立的。当一个 Activity 被 finish 之后,如果没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,不再持有该 Thread 的引用,也就不能再控制该Thread。另一方面,没有办法在不同的 Activity 中对同一 Thread 进行控制。
Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的主线程上的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的主线程上。(上一篇讲过RemoteService的)
例如:如果 一个Thread 需要每隔一段时间连接服务器校验数据,该Thread需要在后台一直运行。这时候如果创建该Thread的Activity被结束了而该Thread没有停止,那么将没有办法再控制该Thread,除非干掉该程序的进程。这时候如果创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以绑定同一个Service,而系统也只会创建一个对应 Service 的实例)。
因此可以把 Service 想象成一种消息服务,可以在任何有 Context 的地方调用startService或bindService来控制它,也可以在 Service 里注册 BroadcastReceiver,通过发送 broadcast 来达到控制的目的,这些都是 Thread 做不到的。
再来看看Service的几个特点:
(1) 默认情况下,Service是运行在主线程中的,如果需要执行复杂耗时的操作,必须在Service中再创建一个Thread来执行任务,以避免出现ANR。
(2) Service的优先级高于后台挂起的Activity。当然,也高于在Activity中所创建的Thread。因此,系统可能在内存不足的时候优先杀死后台的Activity或者Thread,而不会轻易杀死Service组件,即使被迫杀死Service,也会在资源可用时重启被杀死的Service。
其实,Service和Thread根本就不是一个级别的东西,Service是系统的四大组件之一。而Thread只是一个用来执行后台任务的工具类,它可以在Activity中被创建,也可以在Service中被创建。
因此,这个问题的根源应该是,我们不该讨论该使用Service还是Thread,而是应该讨论在什么地方创建Thread?
典型的应用中,它可以在以下三个位置被创建,不同的位置,其生命周期不一样,所以,我们应该根据该Thread的目标生命周期来决定是在Service中创建Thread还是在Activity中创建它。
(1) 在Activity中被创建
一般在onCreate时创建,在onDestroy()中销毁,否则,Activity销毁后,Thread是会依然在后台运行着。
这种情况下,Thread的生命周期即为整个Activity的生命周期。所以,在Activity中创建的Thread只适合完成一些依赖Activity本身有关的任务,比如定时更新一下Activity的控件状态等。
核心特点:该Thread的就是为这个Activity服务的,完成这个特定的Activity交代的任务,主动通知该Activity一些消息和事件,Activity销毁后,该Thread也没有存活的意义了。
(2)在Application中被创建
一般自定义Application类,重载onCreate方法,并在其中创建Thread,当然,也会在onTerminate()方法中销毁Thread,否则,如果Thread没有退出的话,即使整个Application退出了,Thread依然会在后台运行着。
这种情况下,Thread的生命周期即为整个Application的生命周期。所以,在Application中创建的Thread,可以执行一些整个应用级别的任务,比如定时检查一下网络连接状态等等。
核心特点:该Thread的终极目标是为这个APP的各个Activity服务的,包括完成某个Activity交代的任务,主动通知某个Activity一些消息和事件等,APP退出之后该Thread也没有存活的意义了。
以上这两种情况下,Thread的生命周期都不应该超出整个应用程序的生命周期,也就是,整个APP退出之后,Thread都应该完全退出,这样才不会出现内存泄漏或者僵尸线程。那么,如果你希望整个APP都退出之后依然能运行该Thread,那么就应该把Thread放到Service中去创建和启动了。
(3)在Service中被创建
这是保证最长生命周期的Thread的唯一方式,只要整个Service不退出,Thread就可以一直在后台执行,一般在Service的onCreate()中创建,在onDestroy()中销毁。
所以,在Service中创建的Thread,适合长期执行一些独立于APP的后台任务,比较常见的就是:在Service中保持与服务器端的长连接。
核心特点:该Thread可以为APP提供一些“服务”或者“状态查询”,但该Thread并不需要主动通知APP任何事件,甚至不需要知道APP是谁。
总之,我们不是要考虑该用Thread或者该用Service,而是应该为Thread选择合适的生命周期,这就是我对Service和Thread的思考和理解。
边栏推荐
- jniLibs. Srcdirs = ['LIBS'] what's the use?
- Which securities company is better to open an account when making an appointment to play new bonds? It is safer to open an account
- Cookie加密3+RPC解法
- Flush difficult to open an account? Is it safe to open an account online?
- 函数的导数与微分的关系
- Zynq UltraScale + RFSoC ZCU111 RF时钟树学习 1
- Centeros install mangodb
- 一款支持HomeKit的摄像头?智汀 IPC摄像头IC1开箱体验
- Aiops intelligent operation and maintenance experience sharing
- 新人报道的笔记
猜你喜欢

3GPP 5g R17 standard is frozen, and redcap as an important feature deserves attention!

AUTOCAD——五种标注快捷键
Complete the sqlsession interface and implementation classes
Oracle中dbms_output.put_line的用法实例

Iplook 5gc successfully connected with CICA international CHF (billing function)

线程池:ThreadPoolExcutor源码阅读

Cookie加密3+RPC解法

Notes on new reports

UE4_ Ue5 make 3dui follow the camera orientation (attached works)

泡泡玛特:空洞的灵魂需要故事
随机推荐
AUTOCAD——五种标注快捷键
贪心之区间问题(1)
Iplook, as a member of o-ran alliance, will jointly promote the development of 5g industry
vs code突然无法进行代码跳转
泡泡玛特:空洞的灵魂需要故事
Activity跳转到Fragment的方法(Intent)
Exness sorted out three problems to be solved in Musk's acquisition of Twitter
Modèle de langage de pré - formation, Bert, roformer Sim aussi connu sous le nom de simbertv2
2022 operation of simulated examination platform for examination question bank of welder (elementary) special operation certificate
Is it safe for Ping An Securities to open an account? What is its relationship with Ping An Bank?
IPLOOK 成为 RedHat(红帽)业务合作伙伴
5gc and satellite integrated communication scheme
一些技术想法:
Iplook 5gc successfully connected with CICA international CHF (billing function)
【建议收藏】消息队列常见的使用场景
同花顺难开户么?网上开户安全么?
@Lucky user of "Qilu Duojiao", Shandong 5A scenic spot calls you to visit the park for free!
Which securities company is better to open an account when making an appointment to play new bonds? It is safer to open an account
Live broadcast Preview - 12 first-class Chinese scholars open ICLR 2022
session机制详解以及session的相关应用