當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Android多線程的實(shí)現(xiàn)
熟悉java的你,對(duì)多線程編程一定不會(huì)陌生吧。當(dāng)我們需要執(zhí)行一些耗時(shí)操作,比如說發(fā)起一條網(wǎng)絡(luò)請(qǐng)求時(shí),考慮到網(wǎng)速等其他原因,服務(wù)器未必會(huì)立刻響應(yīng)我們的請(qǐng)求,如果不將這類操作放在子線程里去運(yùn)行,就會(huì)導(dǎo)致主線程阻塞,從而影響用戶對(duì)軟件的正常使用并使得用戶體驗(yàn)度降低,那么就讓我們從線程的基本用法開始學(xué)習(xí)吧!
說到線程,就不得不先說線程和進(jìn)程的關(guān)系,這里先簡(jiǎn)單解釋一下。操作系統(tǒng)支持同時(shí)運(yùn)行多個(gè)任務(wù),一個(gè)任務(wù)通常就是一個(gè)程序,每個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程。當(dāng)一個(gè)程序運(yùn)行時(shí),內(nèi)部可能包含了多個(gè)順序執(zhí)行流,每個(gè)順序執(zhí)行流就是一個(gè)線程。
Android提供了四種常用的操作多線程的方式:分別是:
(1)Handler機(jī)制
(2)AsyncTask
(3)Activity.runOnUiThread(Runnable)
(4)IntentService
下面我將對(duì)這四種方式進(jìn)行介紹
Handler機(jī)制(此方法最為常用,這里我將簡(jiǎn)單概述)
Handler來根據(jù)接收的消息,處理UI更新。Thread線程發(fā)出Handler消息,通知更新UI。
代碼如下:
AsyncTask
AsyncTask: 異步任務(wù),從字面上來說,就是在我們的UI主線程運(yùn)行的時(shí)候,異步的完成一些操作。AsyncTask允許我們的執(zhí)行一個(gè)異步的任務(wù)在后臺(tái)。我們可以將耗時(shí)的操作放在異步任務(wù)當(dāng)中來執(zhí)行,并隨時(shí)將任務(wù)執(zhí)行的結(jié)果返回給我們的UI線程來更新我們的UI控件。通過AsyncTask我們可以輕松的解決多線程之間的通信問題。
怎么來理解AsyncTask呢?通俗一點(diǎn)來說,AsyncTask就相當(dāng)于Android給我們提供了一個(gè)多線程編程的一個(gè)框架,其介于Thread和Handler之間,我們?nèi)绻x一個(gè)AsyncTask,就需要定義一個(gè)類來繼承AsyncTask這個(gè)抽象類,并實(shí)現(xiàn)其唯一的一個(gè)doInBackgroud 抽象方法。要掌握AsyncTask,我們就必須要一個(gè)概念,總結(jié)起來就是: 3個(gè)泛型,4個(gè)步驟。
3個(gè)泛型指的是什么呢?我們來看看AsyncTask這個(gè)抽象類的定義,當(dāng)我們定義一個(gè)類來繼承AsyncTask這個(gè)類的時(shí)候,我們需要為其指定3個(gè)泛型參數(shù):
AsyncTask
-Params:這個(gè)泛型指定的是我們傳遞給異步任務(wù)執(zhí)行時(shí)的參數(shù)的類型
-Progress:這個(gè)泛型指定的是我們的異步任務(wù)在執(zhí)行的時(shí)候?qū)?zhí)行的進(jìn)度返回給UI線程的參數(shù)的類型
-Result:這個(gè)泛型指定的異步任務(wù)執(zhí)行完后返回給UI線程的結(jié)果的類型
我們?cè)诙x一個(gè)類繼承AsyncTask類的時(shí)候,必須要指定好這三個(gè)泛型的類型,如果都不指定的話,則都將其寫成Void,例如:
AsyncTask
4個(gè)步驟:當(dāng)我們執(zhí)行一個(gè)異步任務(wù)的時(shí)候,需要按照下面的4個(gè)步驟分別執(zhí)行
-onPreExecute(這個(gè)方法是在執(zhí)行異步任務(wù)之前的時(shí)候執(zhí)行,并且是在UI Thread當(dāng)中執(zhí)行的,通常我們?cè)谶@個(gè)方法里做一些UI控件的初始化的操作,例如彈出要給ProgressDialog
-doInBackground(Params...params):在onPreExecute()方法執(zhí)行完之后,會(huì)馬上執(zhí)行這個(gè)方法,這個(gè)方法就是來處理異步任務(wù)的方法,Android操作系統(tǒng)會(huì)在后臺(tái)的線程池當(dāng)中開啟一個(gè)worker thread來執(zhí)行我們的這個(gè)方法,所以這個(gè)方法是在worker thread當(dāng)中執(zhí)行的,這個(gè)方法執(zhí)行完之后就可以將我們的執(zhí)行結(jié)果發(fā)送給我們的最后一個(gè)onPostExecute方法,在這個(gè)方法里,我們可以從網(wǎng)絡(luò)當(dāng)中獲取數(shù)據(jù)等一些耗時(shí)的操作
-onProgressUpdate(Progess...values): 這個(gè)方法也是在UI Thread當(dāng)中執(zhí)行的,我們?cè)诋惒饺蝿?wù)執(zhí)行的時(shí)候,有時(shí)候需要將執(zhí)行的進(jìn)度返回給我們的UI界面,例如下載一個(gè)網(wǎng)絡(luò)圖片,我們需要時(shí)刻顯示其下載的進(jìn)度,就可以使用這個(gè)方法來更新我們的進(jìn)度。這個(gè)方法在調(diào)用之前,我們需要doInBackground方法中調(diào)用一個(gè)publishProgress(Progress的方法來將我們的進(jìn)度時(shí)時(shí)刻刻傳遞給onProgressUpdate方法來更新
Activity.runOnUiThread(Runnable)
利用runOnUiThread(Runnable)把更新UI的代碼創(chuàng)建在Runnable中,然后在需要更新UI時(shí),把這個(gè)Runnable對(duì)象傳給runOnUiThread(Runnable)。Runnable對(duì)象就能在UI程序中被調(diào)用。如果當(dāng)前線程是UI線程,那么行動(dòng)被立即執(zhí)行。如果當(dāng)前線程不是UI線程,操作是發(fā)布到事件隊(duì)列的UI線程。
代碼如下:
IntentService
IntentService繼承自Service,是一個(gè)經(jīng)過包裝的輕量級(jí)的Service,用來接收并處理通過Intent傳遞的異步請(qǐng)求。客戶端通過調(diào)用startService(Intent)啟動(dòng)一個(gè)IntentService,利用一個(gè)work線程依次處理順序過來的請(qǐng)求,處理完成后自動(dòng)結(jié)束Service。
以上就是我為大家?guī)淼陌沧慷嗑程相關(guān)知識(shí),希望對(duì)大家以后在Android開發(fā)道路中有所幫助,更上一層樓!