欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入剖析Android中Service和Thread區(qū)別

 更新時(shí)間:2016年09月28日 09:49:58   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇深入剖析Android中Service和Thread區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Service既不是進(jìn)程也不是線程,它們之間的關(guān)系如下:

可能有的朋友會(huì)問(wèn)了,既然是長(zhǎng)耗時(shí)的操作,那么Thread也可以完成啊。沒(méi)錯(cuò),在程序里面很多耗時(shí)工作我們也可以通過(guò)Thread來(lái)完成,那么還需要Service干嘛呢。接下來(lái)就為大家解釋以下Service和Thread的區(qū)別。

首先要說(shuō)明的是,進(jìn)程是系統(tǒng)最小資源分配單位,而線程是則是最小的執(zhí)行單位,線程需要的資源通過(guò)它所在的進(jìn)程獲取。

Service與Thread的區(qū)別:

Thread:Thread 是程序執(zhí)行的最小單元,可以用 Thread 來(lái)執(zhí)行一些異步的操作。

Service:Service 是android的一種機(jī)制,當(dāng)它運(yùn)行的時(shí)候如果是Local Service,那么對(duì)應(yīng)的 Service 是運(yùn)行在主進(jìn)程的 main 線程上的。如果是Remote Service,那么對(duì)應(yīng)的 Service 則是運(yùn)行在獨(dú)立進(jìn)程的 main 線程上。

Thread 的運(yùn)行是獨(dú)立的,也就是說(shuō)當(dāng)一個(gè) Activity 被 finish 之后,如果沒(méi)有主動(dòng)停止 Thread 或者 Thread 里的 run 方法沒(méi)有執(zhí)行完畢的話,Thread 也會(huì)一直執(zhí)行。因此這里會(huì)出現(xiàn)一個(gè)問(wèn)題:當(dāng) Activity 被 finish 之后,不再持有該 Thread 的引用,也就是不能再控制該Thread。另一方面,沒(méi)有辦法在不同的 Activity 中對(duì)同一 Thread 進(jìn)行控制。
例如:如果 一個(gè)Thread 需要每隔一段時(shí)間連接服務(wù)器校驗(yàn)數(shù)據(jù),該Thread需要在后臺(tái)一直運(yùn)行。這時(shí)候如果創(chuàng)建該Thread的Activity被結(jié)束了而該Thread沒(méi)有停止,那么將沒(méi)有辦法再控制該Thread,除非kill掉該程序的進(jìn)程。這時(shí)候如果創(chuàng)建并啟動(dòng)一個(gè) Service ,在 Service 里面創(chuàng)建、運(yùn)行并控制該 Thread,這樣便解決了該問(wèn)題(因?yàn)槿魏?Activity 都可以控制同一個(gè)Service,而系統(tǒng)也只會(huì)創(chuàng)建一個(gè)對(duì)應(yīng) Service 的實(shí)例)。
因此可以把 Service 想象成一種消息服務(wù),可以在任何有 Context 的地方調(diào)用 Context.startService、Context.stopService、Context.bindService、Context.unbindService來(lái)控制它,也可以在 Service 里注冊(cè) BroadcastReceiver,通過(guò)發(fā)送 broadcast 來(lái)達(dá)到控制的目的,這些都是 Thread 做不到的。

不少Android初學(xué)者都可能會(huì)有這樣的疑惑,Service和Thread到底有什么關(guān)系呢?什么時(shí)候應(yīng)該用Service,什么時(shí)候又應(yīng)該用Thread?答案可能會(huì)有點(diǎn)讓你吃驚,因?yàn)镾ervice和Thread之間沒(méi)有任何關(guān)系!

之所以有不少人會(huì)把它們聯(lián)系起來(lái),主要就是因?yàn)镾ervice的后臺(tái)概念。Thread我們大家都知道,是用于開啟一個(gè)子線程,在這里去執(zhí)行一些耗時(shí)操作就不會(huì)阻塞主線程的運(yùn)行。而Service我們最初理解的時(shí)候,總會(huì)覺(jué)得它是用來(lái)處理一些后臺(tái)任務(wù)的,一些比較耗時(shí)的操作也可以放在這里運(yùn)行,這就會(huì)讓人產(chǎn)生混淆了。但是,如果我告訴你Service其實(shí)是運(yùn)行在主線程里的,你還會(huì)覺(jué)得它和Thread有什么關(guān)系嗎?讓我們看一下這個(gè)殘酷的事實(shí)吧。

在MainActivity的onCreate()方法里加入一行打印當(dāng)前線程id的語(yǔ)句:

Log.d("MyService", "MainActivity thread id is " + Thread.currentThread().getId()); 

然后在MyService的onCreate()方法里也加入一行打印當(dāng)前線程id的語(yǔ)句:

 Log.d("MyService", "MyService thread id is " + Thread.currentThread().getId()); 

現(xiàn)在重新運(yùn)行一下程序,并點(diǎn)擊Start Service按鈕,會(huì)看到如下打印日志:

可以看到,它們的線程id完全是一樣的,由此證實(shí)了Service確實(shí)是運(yùn)行在主線程里的,也就是說(shuō)如果你在Service里編寫了非常耗時(shí)的代碼,程序必定會(huì)出現(xiàn)ANR的。

你可能會(huì)驚呼,這不是坑爹么???那我要Service又有何用呢?其實(shí)大家不要把后臺(tái)和子線程聯(lián)系在一起就行了,這是兩個(gè)完全不同的概念。Android的后臺(tái)就是指,它的運(yùn)行是完全不依賴UI的。即使Activity被銷毀,或者程序被關(guān)閉,只要進(jìn)程還在,Service就可以繼續(xù)運(yùn)行。比如說(shuō)一些應(yīng)用程序,始終需要與服務(wù)器之間始終保持著心跳連接,就可以使用Service來(lái)實(shí)現(xiàn)。你可能又會(huì)問(wèn),前面不是剛剛驗(yàn)證過(guò)Service是運(yùn)行在主線程里的么?在這里一直執(zhí)行著心跳連接,難道就不會(huì)阻塞主線程的運(yùn)行嗎?當(dāng)然會(huì),但是我們可以在Service中再創(chuàng)建一個(gè)子線程,然后在這里去處理耗時(shí)邏輯就沒(méi)問(wèn)題了。

額,既然在Service里也要?jiǎng)?chuàng)建一個(gè)子線程,那為什么不直接在Activity里創(chuàng)建呢?這是因?yàn)?strong>Activity很難對(duì)Thread進(jìn)行控制,當(dāng)Activity被銷毀之后,就沒(méi)有任何其它的辦法可以再重新獲取到之前創(chuàng)建的子線程的實(shí)例。而且在一個(gè)Activity中創(chuàng)建的子線程,另一個(gè)Activity無(wú)法對(duì)其進(jìn)行操作。但是Service就不同了,所有的Activity都可以與Service進(jìn)行關(guān)聯(lián),然后可以很方便地操作其中的方法,即使Activity被銷毀了,之后只要重新與Service建立關(guān)聯(lián),就又能夠獲取到原有的Service中Binder的實(shí)例。因此,使用Service來(lái)處理后臺(tái)任務(wù),Activity就可以放心地finish,完全不需要擔(dān)心無(wú)法對(duì)后臺(tái)任務(wù)進(jìn)行控制的情況。

以上就是小編為大家?guī)?lái)的深入剖析Android中Service和Thread區(qū)別的全部?jī)?nèi)容了,希望對(duì)大家有所幫助,多多支持腳本之家~

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論