Android中同步與異步的關(guān)系是什么

本篇文章為大家展示了Android中同步與異步的關(guān)系是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、鳳縣網(wǎng)站維護(hù)、網(wǎng)站推廣。

android 只有UI線程可以刷新界面,其他副線程不行,這樣就需要副線程通過(guò)通信消息修改刷新和修改界面。 

有2方式可以實(shí)現(xiàn): 
AsyncTask,Handle 
AsyncTask 
android提供的簡(jiǎn)單用于異步通訊的線程
主要四個(gè)實(shí)現(xiàn)接口: 
    onPreExecute(), 該方法將在執(zhí)行實(shí)際的后臺(tái)操作前被UI 線程調(diào)用??梢栽谠摲椒ㄖ凶鲆恍?zhǔn)備工作,如在界面上顯示一個(gè)進(jìn)度條,或者一些控件的實(shí)例化,這個(gè)方法可以不用實(shí)現(xiàn)。 
    doInBackground(Params...), 將在onPreExecute 方法執(zhí)行后馬上執(zhí)行,該方法運(yùn)行在后臺(tái)線程中。這里將主要負(fù)責(zé)執(zhí)行那些很耗時(shí)的后臺(tái)處理工作??梢哉{(diào)用 publishProgress方法來(lái)更新實(shí)時(shí)的任務(wù)進(jìn)度。該方法是抽象方法,子類必須實(shí)現(xiàn)。 
    onProgressUpdate(Progress...),在publishProgress方法被調(diào)用后,UI 線程將調(diào)用這個(gè)方法從而在界面上展示任務(wù)的進(jìn)展情況,例如通過(guò)一個(gè)進(jìn)度條進(jìn)行展示。 
    onPostExecute(Result), 在doInBackground 執(zhí)行完成后,onPostExecute 方法將被UI 線程調(diào)用,后臺(tái)的計(jì)算結(jié)果將通過(guò)該方法傳遞到UI 線程,并且在界面上展示給用戶. 
    onCancelled(),在用戶取消線程操作的時(shí)候調(diào)用。在主線程中調(diào)用onCancelled()的時(shí)候調(diào)用。 

調(diào)用注意 
1) Task的實(shí)例必須在UI 線程中創(chuàng)建 
2) execute方法必須在UI 線程中調(diào)用 
3) 不要手動(dòng)的調(diào)用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個(gè)方法,需要在UI線程中實(shí)例化這個(gè)task來(lái)調(diào)用。 
4) 該task只能被執(zhí)行一次,否則多次調(diào)用時(shí)將會(huì)出現(xiàn)異常。
5)doInBackground方法返回值和onPostExecute的參數(shù)必須對(duì)應(yīng),這兩個(gè)參數(shù)在AsyncTask聲明的泛型參數(shù)列表中指定,第一個(gè)為doInBackground接受的參數(shù),第二個(gè)為顯示進(jìn)度的參數(shù),第第三個(gè)為doInBackground返回和onPostExecute傳入的參數(shù)。 
可以看到這個(gè)線程有副線程的接口處理doInBackground,也有UI線程的接口處理onProgressUpdate,在啟動(dòng)線程時(shí)可以傳入泛類參數(shù)。 

Handler 
Handler類可以看做工具類,用來(lái)向消息隊(duì)列中插入消息的。實(shí)例化時(shí)自動(dòng)綁定調(diào)用的線程Looper,當(dāng)處理消息時(shí)在該線程中執(zhí)行。利用這個(gè)特性,副線程發(fā)送消息,接受消息后在主線程處理,達(dá)到主線程和副線程的通訊。

在Android里可以這么理解,因?yàn)樵赼ndroid里你可以把UI界面當(dāng)做主線程,你不能因?yàn)橄螺d東西就一直顯示下載,用戶體驗(yàn)不好,也不被google容許,所以你點(diǎn)擊下載就是開(kāi)啟子線程去下載了,手機(jī)頁(yè)面該看什么你就看什么,等下載好子線程就發(fā)個(gè)message給handler它來(lái)更新UI,在你的手機(jī)界面顯示或彈出一個(gè)下載好了的消息,如果不用handler下載好了你也不知道,還得自己去看。Handler和Thread:子線程是不能更新UI的,所以用Thread開(kāi)啟子線程后,如果需要更新UI,就通過(guò)Handler來(lái)更新UI.

而AsyncTask 中:

doInBackground(Params…) 屬于子線程,后臺(tái)執(zhí)行,比較耗時(shí)的操作都可以放在這里。注意這里不能直接操作UI。此方法在后臺(tái)線程執(zhí)行,完成任務(wù)的主要工作,通常需要較長(zhǎng)的時(shí)間。在執(zhí)行過(guò)程中可以 調(diào)用publicProgress(Progress…)來(lái)更新任務(wù)的進(jìn)度。

onPostExecute(Result)  相當(dāng)于Handler 處理UI的方式,在這里面可以使用在doInBackground 得到的結(jié)果處理操作UI。 此方法在主線程執(zhí)行,任務(wù)執(zhí)行的結(jié)果作為此方法的參數(shù)返回

 
looper類是用來(lái)封裝消息循環(huán)和消息隊(duì)列的一個(gè)類。 
(1) Looper類用來(lái)為一個(gè)線程開(kāi)啟一個(gè)消息循環(huán)。 
    默認(rèn)情況下android中新誕生的線程是沒(méi)有開(kāi)啟消息循環(huán)的。(主線程除外,主線程系統(tǒng)會(huì)自動(dòng)為其創(chuàng)建Looper對(duì)象,開(kāi)啟消息循環(huán)。) 
    Looper對(duì)象通過(guò)MessageQueue來(lái)存放消息和事件。一個(gè)線程只能有一個(gè)Looper,對(duì)應(yīng)一個(gè)MessageQueue。
(2) 通常是通過(guò)Handler對(duì)象來(lái)與Looper進(jìn)行交互的。Handler可看做是Looper的一個(gè)接口,用來(lái)向指定的Looper發(fā)送消息及定義處理方法。 
    默認(rèn)情況下Handler會(huì)與其被定義時(shí)所在線程的Looper綁定,比如,Handler在主線程中定義,那么它是與主線程的Looper綁定。 
mainHandler = new Handler() 等價(jià)于new Handler(Looper.myLooper()). 
Looper.myLooper():獲取當(dāng)前進(jìn)程的looper對(duì)象,類似的 Looper.getMainLooper() 用于獲取主線程的Looper對(duì)象。 
(3) 在非主線程中直接new Handler() 會(huì)報(bào)如下的錯(cuò)誤: 
E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exception 
E/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
原因是非主線程中默認(rèn)沒(méi)有創(chuàng)建Looper對(duì)象,需要先調(diào)用Looper.prepare()啟用Looper。 
(4) Looper.loop(); 讓Looper開(kāi)始工作,從消息隊(duì)列里取消息,處理消息。 
    注意:寫在Looper.loop()之后的代碼不會(huì)被執(zhí)行,這個(gè)函數(shù)內(nèi)部應(yīng)該是一個(gè)循環(huán),當(dāng)調(diào)用mHandler.getLooper().quit()后,loop才會(huì)中止,其后的代碼才能得以運(yùn)行。 
(5) 基于以上知識(shí),可實(shí)現(xiàn)主線程給子線程(非主線程)發(fā)送消息。 
    把下面例子中的mHandler聲明成類成員,在主線程通過(guò)mHandler發(fā)送消息即可。 

總結(jié),一般都是綁定主線程的handler,達(dá)到通訊目的,在副線程中發(fā)送消息。若要?jiǎng)?chuàng)建副線程中綁定handler,則必須先創(chuàng)建副線程的looper,已達(dá)到循環(huán)發(fā)送消息的目的。有兩種方式達(dá)到這個(gè)目的: 
1、通過(guò)handler+Looper兩個(gè)類。 
2、通過(guò)HandlerThread這個(gè)類,這個(gè)是android提供的利用Looper和Handler繼承Thread完成。 

上述內(nèi)容就是Android中同步與異步的關(guān)系是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁(yè)標(biāo)題:Android中同步與異步的關(guān)系是什么
鏈接分享:http://muchs.cn/article0/pihpoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、響應(yīng)式網(wǎng)站、網(wǎng)站排名定制網(wǎng)站、網(wǎng)站改版網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司