日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Android 異步消息處理機(jī)制解析

 

Android 中的異步消息處理主要由四個(gè)部分組成,Message、Handler、MessageQueue、Looper。下面將會(huì)對(duì)這四個(gè)部分進(jìn)行一下簡(jiǎn)要的介紹。

1.Message:

Message 是在線程之間傳遞的消息,它可以在內(nèi)部攜帶少量的信息,用于在不同線程之間交換數(shù)據(jù)。通常使用 Message 的 what 字段攜帶命令,除此之外還可以使用 arg1 和arg2 字段來(lái)攜帶一些整形數(shù)據(jù),使用 obj 字段攜帶一個(gè) Object 對(duì)象。

2.Handler:

Handler 顧名思義也就是處理者的意思,它主要是用于發(fā)送和處理消息的。發(fā)送消息一般是使用 Handler 的 sendMessage()方法,而發(fā)出的消息經(jīng)過(guò)一系列地輾轉(zhuǎn)處理后,最終會(huì)傳遞到 Handler 的 handlerMessage()方法中。

3.MessageQueue:

MessageQueue 是消息隊(duì)列的意思,它主要用于存放所有通過(guò) Handler 發(fā)送的消息。這部分消息會(huì)一直存在于消息隊(duì)列中,等待被處理。每個(gè)線程中只會(huì)有一個(gè) MessageQueue 對(duì)象。

4.Looper:

Looper 是每個(gè)線程中的 MessageQueue 的管家,調(diào)用 Looper 的 loop() 方法后,就會(huì)進(jìn)入到一個(gè)無(wú)限循環(huán)當(dāng)中,然后每當(dāng)發(fā)現(xiàn) MessageQueue 中存在一條消息,就會(huì)將它取出,并傳遞到 Handler 的 handleMessage() 方法中。每個(gè)線程中也只會(huì)有一個(gè) Looper 對(duì)象。

異步消息處理流程

Android 異步消息處理機(jī)制解析

 


Android 異步消息處理機(jī)制解析

 

首先需要在主線程當(dāng)中創(chuàng)建一個(gè) Handler 對(duì)象,并重寫(xiě) handleMessage() 方法。然后當(dāng)子線程中需要進(jìn)行UI操作時(shí),就創(chuàng)建一個(gè) Message 對(duì)象,并通過(guò) Handler 將這條消息發(fā)送出去。之后這條消息會(huì)被添加到 MessageQueue 的隊(duì)列中等待被處理,而 Looper 則會(huì)一直嘗試從 MessageQueue 中取出待處理消息

最后分發(fā)回 Handler 的 handleMessage() 方法中。

由于 Handler 是在主線程中創(chuàng)建的,所以此時(shí) handleMessage() 方法中的代碼也會(huì)在主線程中運(yùn)行,于是就可以安心地進(jìn)行UI操作了。

Android 異步消息處理機(jī)制解析

 

一條 Message 經(jīng)過(guò)這樣一個(gè)流程的輾轉(zhuǎn)調(diào)用后,也就從子線程進(jìn)入到了主線程,從不能更新 UI 變成了可更新 UI,整個(gè)異步消息處理的核心思想也就如此。

Android 異步消息處理機(jī)制解析

 

使用AsyncTask

為了更加方便我們?cè)谧泳€程中對(duì) UI 進(jìn)行操作,Android 還提供了另外一些好用的工具,AsyncTask 就是其中之一。借助 AsyncTask,即使你對(duì)異步消息處理機(jī)制完全不了解,也可以十分簡(jiǎn)單地從子線程切換到主線程。當(dāng)然,AsyncTask 背后的實(shí)現(xiàn)原理也是基于異步消息處理機(jī)制的,只是 Android 做了很好的封裝而已。

AsyncTask 的基本用法:

首先來(lái)看一下 AsyncTask 的基本用法,由于 AsyncTask 是一個(gè)抽象類(lèi),所以如果我們想使用它,就必須創(chuàng)建一個(gè)子類(lèi)去繼承它。

在繼承時(shí)我們可以為 AsyncTask 類(lèi)指定三個(gè)泛型參數(shù),這三個(gè)參數(shù)的用途如下:

Params:在執(zhí)行 AsyncTask 時(shí)需要傳入的參數(shù),可用于在后臺(tái)任務(wù)中使用。

Progress:后臺(tái)任務(wù)執(zhí)行時(shí),如果需要在界面上顯示當(dāng)前的進(jìn)度,則使用這里指定的泛型作為進(jìn)度單位。

Result:當(dāng)任務(wù)執(zhí)行完畢后,如果需要對(duì)結(jié)果進(jìn)行返回,則使用這里指定的泛型作為返回值類(lèi)型。

因此,一個(gè)最簡(jiǎn)單定義的AsyncTask就可以寫(xiě)成以下形式:

class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
 ...
 }
}
Android 異步消息處理機(jī)制解析

 

經(jīng)常需要重寫(xiě)的方法還有下面4個(gè)。

  • onPreExecute():

這個(gè)方法會(huì)在后臺(tái)任務(wù)開(kāi)始執(zhí)行之前調(diào)用,用于進(jìn)行一些界面上的初始化操作,比如顯示一個(gè)進(jìn)度條對(duì)話框等。

  • doInBackground(Params…):

這個(gè)方法中的所有代碼都會(huì)在子線程中運(yùn)行,我們應(yīng)該在這里去處理所有的耗時(shí)任務(wù)。注意,在這個(gè)方法中是不可以進(jìn)行 UI 操作的。

  • onProgressUpdate(Progress…):

當(dāng)后臺(tái)任務(wù)中調(diào)用了 publishProgress(Progress…)方法后,這個(gè)方法就會(huì)很快被調(diào)用,方法中攜帶的參數(shù)就是在后臺(tái)任務(wù)中傳遞過(guò)來(lái)的。在這個(gè)方法中可以對(duì)UI 進(jìn)行操作,利用參數(shù)中的數(shù)值就可以對(duì)界面元素進(jìn)行相應(yīng)地更新。

  • onPostExecute(Result):

當(dāng)后臺(tái)任務(wù)執(zhí)行完畢并通過(guò) return 語(yǔ)句進(jìn)行返回時(shí),這個(gè)方法就很快會(huì)被調(diào)用。返回的數(shù)據(jù)會(huì)作為參數(shù)傳遞到此方法中,可以利用返回的數(shù)據(jù)來(lái)進(jìn)行一些 UI操作,比如提醒任務(wù)執(zhí)行的結(jié)果,以及關(guān)閉掉進(jìn)度條對(duì)話框等。

因此一個(gè)完整的自定義AsyncTask可以寫(xiě)成一下格式:

Android 異步消息處理機(jī)制解析

 

簡(jiǎn)單來(lái)說(shuō),使用 AsyncTask 的訣竅就是,在 doInBackground() 方法中去執(zhí)行具體的耗時(shí)任務(wù),在 onProgressUpdate() 方法中進(jìn)行 UI 操作,在 onPostExecute()方法中執(zhí)行一些任務(wù)的收尾工作。

如果想要啟動(dòng)這個(gè)任務(wù),只需編寫(xiě)以下代碼即可:

  • new DownloadTask.execute();

以上就是 AsyncTask 的基本用法。我們并不需要去考慮異步消息處理機(jī)制,也不需要專(zhuān)門(mén)使用一個(gè) Handler 來(lái)發(fā)送和接收消息,只需要調(diào)用一下 publishProgress()方法就可以輕松地從子線程切換到 UI 線程了。、

今年年初我花一個(gè)月的時(shí)間收錄整理了一套知識(shí)體系,如果有想法深入的系統(tǒng)化的去學(xué)習(xí)的,可以私信我【安卓】,我會(huì)把我收錄整理的資料都送給大家,幫助大家更快的進(jìn)階。

分享到:
標(biāo)簽:Android
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定