Android多線程的實現
時間:2018-03-16 來源(yuan):Android多線(xian)程實現(xian)
熟悉java的你,對(dui)多線(xian)(xian)程(cheng)(cheng)編程(cheng)(cheng)一定(ding)不會陌生(sheng)吧。當我們(men)需要(yao)執行(xing)一些耗時操(cao)作,比如(ru)說(shuo)發(fa)起一條網絡請求時,考慮到網速等其(qi)他原因,服務(wu)器未(wei)必會立刻響應我們(men)的請求,如(ru)果不將(jiang)這類操(cao)作放(fang)在(zai)子線(xian)(xian)程(cheng)(cheng)里去運行(xing),就(jiu)會導(dao)致主線(xian)(xian)程(cheng)(cheng)阻(zu)塞,從而影響用戶對(dui)軟件的正(zheng)常使用并使得用戶體驗(yan)度降低,那么就(jiu)讓我們(men)從線(xian)(xian)程(cheng)(cheng)的基本用法(fa)開始學習吧!
說(shuo)到線(xian)(xian)程(cheng)(cheng)(cheng),就(jiu)(jiu)不(bu)得不(bu)先(xian)說(shuo)線(xian)(xian)程(cheng)(cheng)(cheng)和進程(cheng)(cheng)(cheng)的關系(xi),這里先(xian)簡單(dan)解釋一下。操作系(xi)統支持同(tong)時(shi)運行(xing)(xing)多(duo)個(ge)(ge)任務,一個(ge)(ge)任務通常就(jiu)(jiu)是(shi)一個(ge)(ge)程(cheng)(cheng)(cheng)序(xu),每個(ge)(ge)運行(xing)(xing)中的程(cheng)(cheng)(cheng)序(xu)就(jiu)(jiu)是(shi)一個(ge)(ge)進程(cheng)(cheng)(cheng)。當一個(ge)(ge)程(cheng)(cheng)(cheng)序(xu)運行(xing)(xing)時(shi),內(nei)部可能(neng)包(bao)含了(le)多(duo)個(ge)(ge)順序(xu)執行(xing)(xing)流,每個(ge)(ge)順序(xu)執行(xing)(xing)流就(jiu)(jiu)是(shi)一個(ge)(ge)線(xian)(xian)程(cheng)(cheng)(cheng)。
Android提供(gong)了四種常(chang)用的(de)操作多線程的(de)方式:分別(bie)是:
(1)Handler機(ji)制
(2)AsyncTask
(3)Activity.runOnUiThread(Runnable)
(4)IntentService
下面我將對這四種方式進行介紹
Handler機制(此方法最為常用,這里我將簡單概述)
Handler來(lai)根(gen)據接收的消息,處理(li)UI更(geng)新(xin)。Thread線程發出Handler消息,通知(zhi)更(geng)新(xin)UI。
代碼如下:


AsyncTask
AsyncTask: 異步任務(wu),從字面上來說,就是在(zai)(zai)我們的(de)UI主線程(cheng)運行(xing)(xing)的(de)時(shi)候,異步的(de)完(wan)成(cheng)一些操作。AsyncTask允許(xu)我們的(de)執行(xing)(xing)一個異步的(de)任務(wu)在(zai)(zai)后臺(tai)。我們可(ke)以將耗(hao)時(shi)的(de)操作放在(zai)(zai)異步任務(wu)當中來執行(xing)(xing),并隨時(shi)將任務(wu)執行(xing)(xing)的(de)結果返回給我們的(de)UI線程(cheng)來更(geng)新我們的(de)UI控(kong)件。通(tong)過AsyncTask我們可(ke)以輕(qing)松(song)的(de)解(jie)決多線程(cheng)之間的(de)通(tong)信問題。
怎么來(lai)理解AsyncTask呢?通(tong)俗一點來(lai)說,AsyncTask就(jiu)(jiu)相當于Android給(gei)我(wo)們(men)提供了一個(ge)(ge)(ge)多線(xian)程(cheng)編程(cheng)的一個(ge)(ge)(ge)框架(jia),其介于Thread和Handler之間,我(wo)們(men)如(ru)果要(yao)定義(yi)一個(ge)(ge)(ge)AsyncTask,就(jiu)(jiu)需要(yao)定義(yi)一個(ge)(ge)(ge)類(lei)來(lai)繼(ji)承AsyncTask這(zhe)個(ge)(ge)(ge)抽象類(lei),并實現其唯一的一個(ge)(ge)(ge)doInBackgroud 抽象方法。要(yao)掌握AsyncTask,我(wo)們(men)就(jiu)(jiu)必須要(yao)一個(ge)(ge)(ge)概念,總結起來(lai)就(jiu)(jiu)是: 3個(ge)(ge)(ge)泛型,4個(ge)(ge)(ge)步驟。
3個(ge)(ge)泛型指(zhi)的是什么呢(ni)?我們來看看AsyncTask這個(ge)(ge)抽象(xiang)類(lei)(lei)的定(ding)義(yi),當我們定(ding)義(yi)一個(ge)(ge)類(lei)(lei)來繼承(cheng)AsyncTask這個(ge)(ge)類(lei)(lei)的時候,我們需要(yao)為其指(zhi)定(ding)3個(ge)(ge)泛型參數:
AsyncTask
-Params:這個泛(fan)型指定的是我們傳遞給異步任(ren)務執行時的參數的類型
-Progress:這個泛型指定的(de)是我們的(de)異步任務在(zai)執行(xing)的(de)時候將執行(xing)的(de)進度返(fan)回(hui)給UI線程的(de)參數(shu)的(de)類(lei)型
-Result:這(zhe)個泛型指(zhi)定的(de)(de)異步任務執行完后返回給UI線程的(de)(de)結果(guo)的(de)(de)類型
我們在定(ding)義一個類(lei)(lei)繼承AsyncTask類(lei)(lei)的(de)時候,必須要(yao)指(zhi)定(ding)好這三個泛(fan)型(xing)的(de)類(lei)(lei)型(xing),如果都(dou)不指(zhi)定(ding)的(de)話,則(ze)都(dou)將其寫成Void,例(li)如:
AsyncTask
4個(ge)(ge)步驟(zou):當我們執行(xing)一個(ge)(ge)異步任務的時(shi)候(hou),需要按照(zhao)下面的4個(ge)(ge)步驟(zou)分別執行(xing)
-onPreExecute(這(zhe)個方(fang)法是在執行異步任務之前的時候(hou)執行,并且(qie)是在UI Thread當中執行的,通(tong)常我(wo)們在這(zhe)個方(fang)法里(li)做一些UI控件(jian)的初始化的操作,例(li)如彈出要給ProgressDialog
-doInBackground(Params...params):在(zai)(zai)onPreExecute()方(fang)(fang)法執(zhi)行完(wan)之(zhi)后,會馬上(shang)執(zhi)行這(zhe)(zhe)(zhe)個(ge)方(fang)(fang)法,這(zhe)(zhe)(zhe)個(ge)方(fang)(fang)法就(jiu)是(shi)來處理異(yi)步任(ren)務的(de)(de)方(fang)(fang)法,Android操(cao)作系(xi)統(tong)會在(zai)(zai)后臺的(de)(de)線程池當(dang)(dang)中(zhong)開啟(qi)一個(ge)worker thread來執(zhi)行我(wo)(wo)們(men)的(de)(de)這(zhe)(zhe)(zhe)個(ge)方(fang)(fang)法,所以這(zhe)(zhe)(zhe)個(ge)方(fang)(fang)法是(shi)在(zai)(zai)worker thread當(dang)(dang)中(zhong)執(zhi)行的(de)(de),這(zhe)(zhe)(zhe)個(ge)方(fang)(fang)法執(zhi)行完(wan)之(zhi)后就(jiu)可以將(jiang)我(wo)(wo)們(men)的(de)(de)執(zhi)行結(jie)果發送給我(wo)(wo)們(men)的(de)(de)最后一個(ge)onPostExecute方(fang)(fang)法,在(zai)(zai)這(zhe)(zhe)(zhe)個(ge)方(fang)(fang)法里,我(wo)(wo)們(men)可以從網絡當(dang)(dang)中(zhong)獲取數(shu)據(ju)等一些耗時的(de)(de)操(cao)作
-onProgressUpdate(Progess...values): 這個方(fang)法(fa)也是在UI Thread當中(zhong)(zhong)執行(xing)(xing)的(de)(de),我們(men)在異步(bu)任(ren)務執行(xing)(xing)的(de)(de)時候,有(you)時候需(xu)(xu)(xu)要(yao)將(jiang)執行(xing)(xing)的(de)(de)進(jin)度(du)(du)返回給我們(men)的(de)(de)UI界面,例如下載(zai)(zai)一(yi)個網絡圖片,我們(men)需(xu)(xu)(xu)要(yao)時刻(ke)顯示其下載(zai)(zai)的(de)(de)進(jin)度(du)(du),就可(ke)以(yi)使用(yong)這個方(fang)法(fa)來更新我們(men)的(de)(de)進(jin)度(du)(du)。這個方(fang)法(fa)在調用(yong)之前,我們(men)需(xu)(xu)(xu)要(yao)doInBackground方(fang)法(fa)中(zhong)(zhong)調用(yong)一(yi)個publishProgress(Progress的(de)(de)方(fang)法(fa)來將(jiang)我們(men)的(de)(de)進(jin)度(du)(du)時時刻(ke)刻(ke)傳遞(di)給onProgressUpdate方(fang)法(fa)來更新
Activity.runOnUiThread(Runnable)
利用(yong)runOnUiThread(Runnable)把更(geng)新(xin)UI的代碼創建在(zai)(zai)(zai)Runnable中,然后在(zai)(zai)(zai)需要(yao)更(geng)新(xin)UI時,把這(zhe)個Runnable對象傳給runOnUiThread(Runnable)。Runnable對象就能在(zai)(zai)(zai)UI程(cheng)序中被調用(yong)。如果當前線(xian)程(cheng)是UI線(xian)程(cheng),那么(me)行動被立即(ji)執(zhi)行。如果當前線(xian)程(cheng)不是UI線(xian)程(cheng),操(cao)作是發布到(dao)事件隊列(lie)的UI線(xian)程(cheng)。
代碼如下:


IntentService
IntentService繼承(cheng)自(zi)Service,是一(yi)(yi)(yi)個經過包裝的輕量(liang)級(ji)的Service,用來(lai)接收(shou)并處(chu)理通過Intent傳遞的異步請求。客戶端通過調用startService(Intent)啟動一(yi)(yi)(yi)個IntentService,利用一(yi)(yi)(yi)個work線程(cheng)依(yi)次(ci)處(chu)理順(shun)序過來(lai)的請求,處(chu)理完成后自(zi)動結束Service。
以上就是我為大家帶(dai)來的安卓多線程(cheng)相關知識,希望(wang)對(dui)大家以后在Android開發道路(lu)中有所幫(bang)助(zhu),更上一層樓!

