当前位置:网站首页>到底使用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的思考和理解。
边栏推荐
猜你喜欢

vs code突然无法进行代码跳转
Oracle中dbms_output.put_line的用法实例

AUTOCAD——五种标注快捷键

Dynamically changing the style of label elements in a loop
组合学笔记(五)分配格中的链
Golang implements reliable delay queue based on redis

3GPP 5g R17 standard is frozen, and redcap as an important feature deserves attention!
Set of redis data structure

函数的导数与微分的关系

PostgreSQL 字符串分隔函数(regexp_split_to_table)介绍以及示例应用
随机推荐
贪心之分配问题(1)
Exness sorted out three problems to be solved in Musk's acquisition of Twitter
Activity跳转到Fragment的方法(Intent)
Array emulation stack
jsp连接MySQL总出错
Traditional image -- LBP feature
Mysql如何删除数据库表中的某一列
Several important viewpoints on operation and maintenance, monitoring and aiops
In May, 2022, China's game manufacturers and applications went to sea, with top 30 revenue in EMEA region
数字赋能机械制造业,供应链协同管理系统解决方案助力企业供应链再升级
Babbitt | yuancosmos daily must read: it is said that Tencent has established XR department, and yuancosmos sector has risen again. Many securities companies have issued reports to pay attention to th
@Lucky user of "Qilu Duojiao", Shandong 5A scenic spot calls you to visit the park for free!
2022 G2 power plant boiler stoker question bank and online simulation examination
plsql变量赋值问题
Cookie encryption 3+rpc solution
预约打新债哪个券商公司开户好,开账户是更安全呢
IPLOOK 成为 RedHat(红帽)业务合作伙伴
数组实现循环链表
如何更改Apple Watch上的表盘
Which securities company is better to open an account when making an appointment to play new bonds? It is safer to open an account