android開發(fā)課件:多線程操作_第1頁
android開發(fā)課件:多線程操作_第2頁
android開發(fā)課件:多線程操作_第3頁
android開發(fā)課件:多線程操作_第4頁
android開發(fā)課件:多線程操作_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Android中的多線程操作Runnable接口的使用Handler類的使用傳遞Message對象傳遞Runnable對象Asynctask類的使用什么時候用到線程當(dāng)我們需要某些事情同步發(fā)生時,需要用到線程。拷貝文件時,還可以上網(wǎng)、編程??截愇募且粋€單獨的線程。寫程序時,還可以聽音樂。音樂播放是一個線程。Service類本身常常會啟動一個單獨的線程。當(dāng)我們需要一些耗時的后臺功能時,需要用到線程。比如,可以單獨寫一個線程,用于網(wǎng)絡(luò)連接。這樣不會耽誤其它事情。單獨寫一個線程,用于后臺文件的讀和寫。其它。。。。。。。線程線程是獨立的程序單元,多個線程可以并行工作在多處理器系統(tǒng)中,每個中央處理器(CPU)單獨運行一個線程,因此線程是并行工作的在單處理器系統(tǒng)中,處理器會給每個線程一小段時間,在這個時間內(nèi)線程是被執(zhí)行的,然后處理器執(zhí)行下一個線程,這樣就產(chǎn)生了線程并行運行的假象無論線程是否真的并行工作,在宏觀上可以認(rèn)為子線程是獨立于主線程,且能與主線程并行工作的程序單元一個例子實現(xiàn)run()函數(shù)創(chuàng)建線程要創(chuàng)建線程,只需要實現(xiàn)Java的Runnable接口,并重載run()方法。在run()中放置代碼的主體部分,即線程的執(zhí)行部分。使用線程創(chuàng)建Thread對象,并將上面實現(xiàn)的Runnable對象作為參數(shù)傳遞給Thread對象調(diào)用start()方法啟動線程停止線程當(dāng)run()函數(shù)結(jié)束后,線程將自動退出。比如,文件拷貝結(jié)束后,線程自動退出。比如,網(wǎng)絡(luò)連上后,線程自動退出。Run()函數(shù)寫法:while(someCondition==true){}如果需要外部事件來觸發(fā)停止線程,有兩種方法使用Thread.Interrupt()函數(shù),中斷線程。Run函數(shù):while(!Thread.interrupted()){}使用布爾型標(biāo)識符,中斷線程。Run函數(shù):while(!bStop){},其中bStop是布爾變量使用interrupt函數(shù)中斷線程如果是阻塞代碼,有些是可終止,有些是不可終止。在可終止的時候,處理interruptedException利用sleep或者wait函數(shù)可使線程被中斷終止。阻塞不可停止的時候,就要使用標(biāo)識符方法整個調(diào)用過程創(chuàng)建一個實現(xiàn)Runnable接口的類MyThread。利用該接口,作為Thread類的參數(shù),創(chuàng)建Thread類。利用Thread類的start函數(shù)啟動線程。利用Thread類的interrupt函數(shù)終止線程。運行結(jié)果運行開始后,每隔10s在LogCat中顯示信息。如果點擊某按鈕,停止線程,則出現(xiàn)最后一句提示:InterruptedException。具體見本PPT第4頁代碼。使用標(biāo)識符終止線程這是一種更加簡單有效通用的方法!定義的標(biāo)識符利用標(biāo)識符來控制run函數(shù)的終止。Run函數(shù)結(jié)束,線程也就結(jié)束了。運行結(jié)果使用過程和之前的一致。Thread類和Runnable類在java中可有兩種方式實現(xiàn)多線程,一種是繼承Thread類,一種是實現(xiàn)Runnable接口。兩者都是在java.lang包中定義的。都只要實現(xiàn)(覆蓋或者實現(xiàn))了本類中的run()方法就可以實現(xiàn)多線程操作了。在實際開發(fā)中一個多線程的操作很少使用Thread類,而是通過Runnable接口完成。Runnable接口和Thread之間的聯(lián)系:publicclassThreadextendsObjectimplementsRunnable發(fā)現(xiàn)Thread類也是Runnable接口的子類。關(guān)于Runnable和Thread類的詳細差別和案例分析何時使用Handler類Android中的UI主線程不是線程安全的。開發(fā)人員必須注意以下兩點:更新UI界面的操作必須在UI主線程中進行。在Android中不允許Activity新啟動的線程訪問該Activity里的UI組件耗時操作不能在UI主線程中進行,否則會出現(xiàn)ANR錯誤那么如果我要完成一個耗時操作,結(jié)束后更新UI界面來顯示耗時操作的結(jié)果,應(yīng)該怎么辦呢?有兩種方法使用Thread+Handler使用AsyncTask抽象類為什么要有Handler類當(dāng)應(yīng)用程序啟動時,Android首先會開啟一個主線程(也就是UI線程),主線程為管理界面中的UI控件,進行事件分發(fā),比如說,你要是點擊一個Button,Android會分發(fā)事件到Button上,來響應(yīng)你的操作。如果此時需要一個耗時的操作,例如:聯(lián)網(wǎng)讀取數(shù)據(jù),或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現(xiàn)假死現(xiàn)象,如果5秒鐘還沒有完成的話,會收到Android系統(tǒng)的一個錯誤提示"強制關(guān)閉".這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的.這個時候,Handler就出現(xiàn)了來解決這個復(fù)雜的問題,由于Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數(shù)據(jù),這個時候,Handler就承擔(dān)著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(里面包含數(shù)據(jù)),把這些消息放入主線程隊列中,配合主線程進行更新UI可能的例子比如,拷貝文件時,進度條會根據(jù)拷貝進度進行更新。進度條的更新必須在主Activity里進行,而文件的拷貝可能是一個獨立的線程。主進程與線程的溝通需要使用Handler。比如,當(dāng)主進程需要訪問某個數(shù)據(jù)庫,并執(zhí)行檢索功能。接收后,返回檢索到的數(shù)據(jù)個數(shù)。那么數(shù)據(jù)庫的訪問可能就是一個獨立的線程,而主進程得到結(jié)果后更新檢索結(jié)果TextView控件。這時也可以使用Handler類。處理Message:一個實際例子在線程中對一個進度條設(shè)置最新的進度。然后在handler類的handleMessage函數(shù)中更新UI中的進度條。Handler類說明Handler直接繼承自O(shè)bject,一個Handler允許發(fā)送和處理Message或者Runnable對象。Message類:使用Message.obtain函數(shù)生成一個Message類。arg1和arg2用于傳遞不復(fù)雜的單值數(shù)據(jù),復(fù)雜數(shù)據(jù)使用setData()傳遞。Objectobj:傳遞一個任意的對象。intwhat:定義的消息碼,一般用于設(shè)定消息的標(biāo)志。使用Handler.sendMessage函數(shù)發(fā)送消息。重載handleMessage函數(shù),在UI線程中對消息進行解析,并處理UI的相關(guān)操作。小貼士注意,如果聲明一個Handler類,系統(tǒng)未提示你“AddUnImplementedMethods”時,可以通過在Handler類的實現(xiàn)主體{}內(nèi),右鍵->source->Override/ImplementMethods,選擇handleMessage方法(下圖中handleMessage已重載,故無法看到)。

Message.what的使用區(qū)分不同的消息傳遞更多數(shù)據(jù)時。。。使用setData和getData函數(shù),利用Bundle類傳遞數(shù)據(jù)。發(fā)送消息相關(guān)的函數(shù)booleansendMessage(Messagemsg):發(fā)送一個Message對象到消息隊列中,并在UI線程取到消息后,立即執(zhí)行。booleansendMessageDelayed(Messagemsg,longdelayMillis):發(fā)送一個Message對象到消息隊列中,在UI線程取到消息后,延遲delayMillis毫秒執(zhí)行。sendEmptyMessage(intwhat):發(fā)送一個空的Message對象到隊列中,并在UI線程取到消息后,立即執(zhí)行。sendEmptyMessageDelayed(intwhat,longdelayMillis):發(fā)送一個空Message對象到消息隊列中,在UI線程取到消息后,延遲執(zhí)行。

removeMessage():從消息隊列中移除一個未響應(yīng)的消息。sendMessageAtFrontOfQueue(Messagemsg):發(fā)送消息到消息隊列,并插入頭部。sendMessageAtTime(Messagemsg,longuptimeMillis):在某時間點發(fā)送消息處理Runnable對象上面介紹到Handler可以把一個Message對象或者Runnable對象壓入到消息隊列中,進而在UI線程中獲取Message或者執(zhí)行Runnable對象,所以Handler把壓入消息隊列有兩大體系,Post和sendMessage。sendMessage用于壓入消息類,上面已經(jīng)介紹。Post:Post允許把一個Runnable對象入隊到消息隊列中。與Message的處理類似,它的方法有:post(Runnable)、postAtTime(Runnable,long)、postDelayed(Runnable,long)。一個例子對于Post方式而言,它其中Runnable對象的run()方法的代碼,均執(zhí)行在UI線程上,所以對于這段代碼而言,不能執(zhí)行在UI線程上的操作,一樣無法使用post方式執(zhí)行更多例子,可以參看以下網(wǎng)址:/plokmju/p/android_handler.html

注意:上述只可在主線程中進行操作的控件,一般指的是屬于android.view.widget這個類包中的UI組件。AsyncTask類雖然Runnable+Handler類可以很好的處理后臺進程與UI更新的任務(wù),但是稍顯復(fù)雜。為了更加方便我們在子線程中更新UI元素,Android從1.5版本就引入了一個AsyncTask類,使用它就可以非常靈活方便地從子線程切換到UI線程。使用AsyncTask類,可以更加清晰、簡單地實現(xiàn)一些異步操作。新建一個Asynctask類通過系統(tǒng)菜單的New->class,可以新建一個AsyncTask類,新建時如下所示。其中,Params,Progress和Result是三個泛型參數(shù)。Params:啟動任務(wù)執(zhí)行的輸入?yún)?shù),比如HTTP請求的URL。Progress:后臺任務(wù)執(zhí)行的百分比Result:后臺執(zhí)行任務(wù)最終返回的結(jié)果這三個參數(shù)可以由用戶自己進行重定義,可以是任意類型。比如,一個網(wǎng)頁加載的任務(wù):啟動時的Params是網(wǎng)址,是String類型。后臺執(zhí)行的百分比,是int類型。返回結(jié)果,顯示執(zhí)行的情況,并顯示一些加載任務(wù)是否成功的消息,可以是String類型。這樣該類可以定義為:Asynctask的重要函數(shù)AsyncTask是一個抽線類,需要重載它的一些函數(shù)。如右圖所示。doInBackgroud函數(shù)后臺執(zhí)行,比較耗時的操作都可以放在這里。注意這里不能直接操作UI。該函數(shù)的輸入?yún)?shù)就是泛型Params參數(shù),即String類型。onProgressUpdate函數(shù)在主線程執(zhí)行,用于顯示任務(wù)執(zhí)行的進度。輸入?yún)?shù)就是泛型Progess參數(shù),即Int型。onPostExecute函數(shù)在doInBackgroud函數(shù)結(jié)束時,此方法將會被調(diào)用,計算結(jié)果將做為參數(shù)傳遞到此方法中,直接將結(jié)果顯示到UI組件上。輸入函數(shù)就是泛型Result參數(shù),即String類型onPreExecute函數(shù):當(dāng)任務(wù)執(zhí)行之前開始調(diào)用此方法,可以在這里進行一些初始化。調(diào)用過程生成一個AsyncTask類的實例,并調(diào)用execute函數(shù)啟動異步進程。實際上,該函數(shù)將觸發(fā)doInBackGround方法,execute的參數(shù)也將傳入doInBackGround方法。在網(wǎng)頁加載過程中,在doInBackGround中調(diào)用AsyncTask類的publishProgress()函數(shù)。該函數(shù)將觸發(fā)onProgressUpdate方法對UI進行操作。當(dāng)doInBackGround結(jié)束后,其返回結(jié)果將返回給onPostExecute方法。因此,doInBackGround方法的返回類型,也就是onPostExecute方法的輸入類型。Thread,Runnable和A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論