版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十一章:網(wǎng)絡(luò)編程
第十一章:網(wǎng)絡(luò)編程1
HTTP協(xié)議Handle消息機(jī)制原理
Asynctask網(wǎng)絡(luò)狀態(tài)
HttpURLConnection訪問(wèn)網(wǎng)絡(luò)數(shù)據(jù)提交方式JSON解析本章小結(jié)目錄HTTP協(xié)議Handle消息機(jī)制原理Asynctask網(wǎng)2一、HTTP協(xié)議WWW是以Internet作為傳輸媒介的一個(gè)應(yīng)用系統(tǒng),WWW網(wǎng)上基本的傳輸單位是Web網(wǎng)頁(yè)。WWW的工作是基于客戶機(jī)/服務(wù)器計(jì)算模型,由Web瀏覽器和Web服務(wù)器構(gòu)成,兩者之間采用超文本傳輸協(xié)議HTTP進(jìn)行通信。HTTP協(xié)議時(shí)基于TCP/IP協(xié)議之上的協(xié)議,是Web瀏覽器和Web服務(wù)器之間的應(yīng)用層的協(xié)議,是通用的、無(wú)狀態(tài)的面向?qū)ο蟮膮f(xié)議。一、HTTP協(xié)議WWW是以Internet作為傳輸媒介的一個(gè)3一、HTTP協(xié)議例如在日常生活中,當(dāng)人們想看新聞時(shí)在手機(jī)瀏覽器輸入,即可進(jìn)入網(wǎng)易新聞,此訪問(wèn)過(guò)程是通過(guò)HTTP協(xié)議完成的,手機(jī)端訪問(wèn)服務(wù)器端的圖解過(guò)程如圖11-1所示。圖11-1HTT請(qǐng)求與響應(yīng)一、HTTP協(xié)議例如在日常生活中,當(dāng)人們想看新聞時(shí)在手機(jī)瀏覽4二、Handle消息機(jī)制原理在Android系統(tǒng)整體優(yōu)化性能的考慮,Android的UI操作是線程安全的,這樣導(dǎo)致有多個(gè)線程并發(fā)操作UI組件時(shí),可能出現(xiàn)線程安全問(wèn)題。當(dāng)應(yīng)用程序啟動(dòng)時(shí),會(huì)開啟一個(gè)主線程(也就是UI線程),由它來(lái)管理UI,監(jiān)聽用戶點(diǎn)擊,來(lái)響應(yīng)用戶并分發(fā)事件等。所以一般在主線程中不要執(zhí)行比較耗時(shí)的操作,如聯(lián)網(wǎng)下載數(shù)據(jù)等,否則出現(xiàn)ANR錯(cuò)誤。二、Handle消息機(jī)制原理在Android系統(tǒng)整體優(yōu)化性能5二、Handle消息機(jī)制原理注意:線程安全是指多線程訪問(wèn)時(shí),采用加鎖機(jī)制,當(dāng)一個(gè)線程訪問(wèn)該類的某個(gè)數(shù)據(jù)時(shí),對(duì)數(shù)據(jù)進(jìn)行保護(hù),其他線程不能進(jìn)行訪問(wèn),直到該線程讀取完,這樣做的目的是不會(huì)出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。線程不安全是指多線程訪問(wèn)時(shí),不提供數(shù)據(jù)訪問(wèn)保護(hù),有可能出現(xiàn)多個(gè)線程先后更改數(shù)據(jù)造成所得到的數(shù)據(jù)可能是臟數(shù)據(jù)。二、Handle消息機(jī)制原理注意:6二、Handle消息機(jī)制原理
Handler類主要做兩件事:一是在新啟動(dòng)的子線程中發(fā)送消息;二是在主線程中獲取、處理消息。主線程處理新的子線程發(fā)送過(guò)來(lái)的消息,主要是通過(guò)回調(diào)方法來(lái)實(shí)現(xiàn)程序開發(fā)者重寫Handler類處理消息方法,當(dāng)新的子線程發(fā)送消息過(guò)來(lái)后,消息會(huì)與關(guān)聯(lián)的MessageQueue綁定,而Handler將從MessageQueue中獲取消息。二、Handle消息機(jī)制原理
Handler類主要做兩件事7二、Handle消息機(jī)制原理
Handler機(jī)制主要包括4個(gè)對(duì)象,分別是Message、MessageQueue、Handler、Looper。Message:包含描述和任意數(shù)據(jù)對(duì)象的消息,用于發(fā)送給Handler。它主要在不同線程間進(jìn)行數(shù)據(jù)交換。MessageQueue:是指消息隊(duì)列,它主要用來(lái)接收Handler發(fā)送過(guò)來(lái)的消息,這些消息存放在MessageQueue中等待處理。Handler:是指發(fā)送消息與處理消息的對(duì)象。Looper:是每個(gè)線程中的MessageQueue管理者。二、Handle消息機(jī)制原理
Handler機(jī)制主要包括4個(gè)8二、Handle消息機(jī)制原理Handler處理消息的步驟如下:(1)在Activity中聲明Handler對(duì)象,然后重寫handleMessage()方法。(2)在新啟動(dòng)的線程中調(diào)用sendMessage()或sendEmptyMessage()方法向Handler發(fā)送消息。(3)在Handler對(duì)象中使用handleMessage()方法接收消息,然后根據(jù)消息做后續(xù)操作處理。二、Handle消息機(jī)制原理Handler處理消息的步驟如9二、Handle消息機(jī)制原理Handler的常用方法及說(shuō)明。方法說(shuō)明voidhandleMessage(Messagemsg)消息發(fā)送后在這個(gè)方法中接收處理booleansendMessage(Messagemsg)發(fā)送消息到HandlerbooleansendEmptyMessage(intwhat)發(fā)送只有一個(gè)what值的消息booleansendMessageDelayed(Messagemsg,longdelayMillis)延時(shí)發(fā)送消息voidremoveMessages(intwhat)刪除消息/取消定時(shí)消息表11-1Handler的常用方法二、Handle消息機(jī)制原理Handler的常用方法及說(shuō)明10二、Handle消息機(jī)制原理
當(dāng)MessageQueue有消息進(jìn)來(lái)時(shí),將它取出并傳遞給Handler的handleMessage()方法。在主線程創(chuàng)建Handler對(duì)象時(shí),系統(tǒng)已經(jīng)創(chuàng)建了Looper對(duì)象,不需要程序開發(fā)者手動(dòng)創(chuàng)建。Handler消息處理流程如下圖11-2所示。二、Handle消息機(jī)制原理
當(dāng)MessageQueue11二、Handle消息機(jī)制原理
從圖11-2可以看到整個(gè)Handler消息處理流程。先在UI線程中創(chuàng)建一個(gè)Handler對(duì)象,然后在子線程中使用Handler的sendMessage()方法,接著將此消息存放到MessageQueue中,之后使用Looper對(duì)象取出MessageQueue中的消息,最后發(fā)送給Handler對(duì)象的handleMessage()方法做后續(xù)操作處理。圖11-2Handler消息處理流程二、Handle消息機(jī)制原理
從圖11-2可以看到整個(gè)12
二、Handle消息機(jī)制原理
【例11.1】通過(guò)Handler實(shí)現(xiàn)每隔1S鐘更換一個(gè)TextView背景色一次,并在TextView中設(shè)置文字顯示的內(nèi)容為當(dāng)前的顏色?!菊f(shuō)明】本例主要使用兩個(gè)類,一個(gè)是繼承Activity的類,在其中聲明Handler對(duì)象,并重寫handleMessage()方法,在此方法中根據(jù)消息的值來(lái)更改TextView背景色以及文字的內(nèi)容;另一個(gè)是繼承Thread的類,并重寫run()方法,在此類下使用sendEmptyMessage()方法向Handler發(fā)送消息。
二、Handle消息機(jī)制原理
【例11.1】通過(guò)Hand13二、Handle消息機(jī)制原理【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬器,接著運(yùn)行Handler_test項(xiàng)目,顯示效果如圖11-3所示,點(diǎn)擊“啟動(dòng)”按鈕后的效果如圖11-4所示。圖11-3運(yùn)行效果圖11-4點(diǎn)擊“啟動(dòng)”后效果二、Handle消息機(jī)制原理【運(yùn)行結(jié)果】在Eclipse14三、Asynctask
Asynctask是抽象類,創(chuàng)建一個(gè)類繼承此類時(shí),可以指定三個(gè)泛型參數(shù),這個(gè)三個(gè)參數(shù)的作用分別如下:Params:在執(zhí)行Asynctask時(shí)需要傳入的參數(shù),用于后臺(tái)任務(wù)中使用。比如HTTP請(qǐng)求的URL。Progress:在后臺(tái)任務(wù)執(zhí)行時(shí),如果需要的界面上顯示進(jìn)度,此參數(shù)將作為百分比。Result:后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String類型。三、Asynctask
Asynctask是抽象類,創(chuàng)建一15三、Asynctask
Asynctask的執(zhí)行過(guò)程分以下四個(gè)步驟,每一步對(duì)應(yīng)一個(gè)回調(diào)方法。(1)onPreExecute(),此方法在執(zhí)行后臺(tái)操作前被主線程調(diào)用。可以在此方法中做一些前期準(zhǔn)備工作,如顯示一個(gè)進(jìn)度條。(2)doInBackground(Params…),此方法在onPreExecute()方法執(zhí)行后馬上執(zhí)行,在后臺(tái)線程中運(yùn)行,這里主要用來(lái)處理一些耗時(shí)操作。注意,此方法是抽象方法,子類必須實(shí)現(xiàn)它。在這個(gè)方法中可以使用publicProgress(Progress…)來(lái)更新任務(wù)的進(jìn)度。三、Asynctask
Asynctask的執(zhí)行過(guò)程分以下16三、Asynctask(3)onProgressUpdate(Progress…),在publishProgress(Progress…)方法被調(diào)用后,UI線程將調(diào)用此方法來(lái)更新界面展示任務(wù)的進(jìn)度,方法中攜帶的參數(shù)是后臺(tái)任務(wù)中傳遞過(guò)來(lái)的數(shù)據(jù)。(4)onPostExecute(Result),在doInBackground()方法執(zhí)行完成后返回的參數(shù)傳遞到此方法中,進(jìn)行后續(xù)處理,如提醒當(dāng)前任務(wù)已經(jīng)完成。三、Asynctask(3)onProgressUpdate17三、Asynctask
Asynctask的執(zhí)行過(guò)程如圖11-5所示。圖11-5Asynctask的執(zhí)行過(guò)程三、Asynctask
Asynctask的執(zhí)行過(guò)程如圖18三、AsynctaskAsynctask的使用還要用到一些其他方法,如表11-2所示。
表11-2Asynctask的常用方法方法說(shuō)明AsyncTaskexecute(Params...params)開啟任務(wù)booleancancel(booleanmayInterruptIfRunning)取消任務(wù)的執(zhí)行AsyncTask.StatusgetStatus()獲取任務(wù)的當(dāng)前狀態(tài)booleanisCancelled()如果任務(wù)正常后取消任務(wù)返回true,否則為false三、AsynctaskAsynctask的使用還要用到一些19三、Asynctask
【例11.2】通過(guò)Asynctask求用戶輸入一個(gè)數(shù)內(nèi)的所包含的合數(shù),并把這些合數(shù)顯示在用戶界面上。
【說(shuō)明】本例主要使用Asynctask類的四個(gè)方法,onPreExecute()方法控制按鈕的可用狀態(tài),
onPostExecute(Result)方法輸出最終結(jié)果,doInBackground(Params…)與onProgressUpdate
(Progress…)實(shí)時(shí)處理得到的合數(shù)并顯示在用戶界面上。
三、Asynctask
【例11.2】通過(guò)Asynctask20三、Asynctask
【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬器,接著運(yùn)行Asynctask_test項(xiàng)目,顯示效果如圖11-6所示,輸入100,點(diǎn)擊“開始計(jì)算”按鈕后的效果如圖11-7所示。圖11-6運(yùn)行效果圖11-7“開始計(jì)算”效果三、Asynctask
【運(yùn)行結(jié)果】在Eclipse中啟21四、網(wǎng)絡(luò)狀態(tài)
現(xiàn)在大量的Android應(yīng)用程序需要在網(wǎng)絡(luò)上獲取數(shù)據(jù),但是在獲取網(wǎng)絡(luò)數(shù)據(jù)之前,先要對(duì)數(shù)據(jù)狀態(tài)進(jìn)行判斷,這樣可以提升用戶體驗(yàn)。網(wǎng)絡(luò)使用的場(chǎng)景:用戶界面上需要表述當(dāng)前網(wǎng)絡(luò)狀態(tài);Android應(yīng)用程序后臺(tái)要根據(jù)不同的網(wǎng)絡(luò)狀態(tài)來(lái)處理數(shù)據(jù);Android應(yīng)用程序后臺(tái)要根據(jù)網(wǎng)絡(luò)情況來(lái)開啟相關(guān)服務(wù)。四、網(wǎng)絡(luò)狀態(tài)
現(xiàn)在大量的Android應(yīng)用程序需要在網(wǎng)絡(luò)22四、網(wǎng)絡(luò)狀態(tài)
獲取網(wǎng)絡(luò)服務(wù)的步驟:(1)獲得系統(tǒng)服務(wù)。ConnectivityManager負(fù)責(zé)管理所有的連接服務(wù)。使用getSystemService()獲得系統(tǒng)服務(wù),系統(tǒng)服務(wù)包括3G/4G、WiFi、藍(lán)牙服務(wù)。(2)獲得網(wǎng)絡(luò)服務(wù)。通過(guò)ConnectivityManager的getActiveNetworkInfo()方法獲得NetworkInfo類,此類即可用來(lái)檢測(cè)網(wǎng)絡(luò)的狀態(tài)與類型。四、網(wǎng)絡(luò)狀態(tài)
獲取網(wǎng)絡(luò)服務(wù)的步驟:23四、網(wǎng)絡(luò)狀態(tài)【例11.3】判斷當(dāng)前手機(jī)的網(wǎng)絡(luò)連接狀態(tài)與類型。
【說(shuō)明】本例通過(guò)使用ConnectivityManager.
getA-ctiveNetworkInfo()方法獲得NetworkInfo類,然后檢測(cè)網(wǎng)絡(luò)連接狀態(tài)與類型。四、網(wǎng)絡(luò)狀態(tài)【例11.3】判斷當(dāng)前手機(jī)的網(wǎng)絡(luò)連接狀態(tài)與類型。24四、網(wǎng)絡(luò)狀態(tài)【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬器,接著運(yùn)行NetworkConnectivity_test項(xiàng)目,移動(dòng)網(wǎng)絡(luò)打開時(shí)的顯示效果如圖11-8所示,WiFi打開時(shí)的顯示效果如圖11-9所示。圖11-8移動(dòng)網(wǎng)絡(luò)效果圖11-9WIFI打開效果四、網(wǎng)絡(luò)狀態(tài)【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Andr25五、HttpURLConnection訪問(wèn)網(wǎng)絡(luò)
在Android開發(fā)應(yīng)用中,大量應(yīng)用程序需要與服務(wù)器進(jìn)行數(shù)據(jù)交互,此時(shí)就可以使用HttpURLConnection對(duì)象。HttpURLConnection的通信基本流程:1.創(chuàng)建URL;2.創(chuàng)建HttpURLConnection;3.設(shè)置HttpURLConnection請(qǐng)求參數(shù);4.URLConnection建立連接;5.HttpURLConnection發(fā)送請(qǐng)求;6.HttpURLConneciton獲取響應(yīng)。五、HttpURLConnection訪問(wèn)網(wǎng)絡(luò)
在Andro26【例11.4】從網(wǎng)絡(luò)獲取一個(gè)圖片并顯示在Android應(yīng)用程序界面上。
【說(shuō)明】訪問(wèn)網(wǎng)絡(luò)資源使用HttpURLConnection對(duì)象來(lái)進(jìn)行通信。結(jié)果如下圖所示:圖11-10運(yùn)行時(shí)項(xiàng)目效果圖11-11“提交”后效果【例11.4】從網(wǎng)絡(luò)獲取一個(gè)圖片并顯示在Android應(yīng)用程27六、數(shù)據(jù)提交方式HTTP/1.1協(xié)議規(guī)定的HTTP請(qǐng)求方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、這八種。六、數(shù)據(jù)提交方式HTTP/1.1協(xié)議規(guī)定的HTTP請(qǐng)求28六、數(shù)據(jù)提交方式1.POST與GET兩種請(qǐng)求方式的區(qū)別GET方式是以實(shí)體方式得到由請(qǐng)求URL所指向的資源信息,它向服務(wù)器提交的參數(shù)緊跟在URL后面。使用GET方式訪問(wèn)網(wǎng)絡(luò)時(shí)URL的長(zhǎng)度是有限制的,一般情況下請(qǐng)求URL的長(zhǎng)度不超過(guò)1KB。POST方式是向服務(wù)器發(fā)送請(qǐng)求,然后接收附在請(qǐng)求后的數(shù)據(jù)。它向服務(wù)器提交數(shù)據(jù)是以流的方式直接寫給服務(wù)器的,這種方式對(duì)URL的長(zhǎng)度沒(méi)有限制。六、數(shù)據(jù)提交方式1.POST與GET兩種請(qǐng)求方式的區(qū)別29七、
JSON1.JSON定義JSON(JavaScriptObjectNotation)是javscript對(duì)象標(biāo)記,是一種基于文本的、獨(dú)立于語(yǔ)言的輕量級(jí)數(shù)據(jù)交換格式。易于閱讀和編寫,易于機(jī)器解析和生成。七、JSON1.JSON定義30七、
JSON
JSON數(shù)據(jù)的書寫格式是:名稱/值對(duì)。名稱/值對(duì)包括字段名稱(在雙引號(hào)中),后面寫一個(gè)冒號(hào),然后是值,如"name":"zhangsan"。JSON對(duì)象在花括號(hào)中書寫,對(duì)象可以包含多個(gè)名稱/值對(duì)。如:{"name":"zhangsan","age":"21"}。JSON數(shù)組在方括號(hào)中書寫,數(shù)組可包含多個(gè)對(duì)象。七、JSON
JSON數(shù)據(jù)的書寫格式是:名稱/值對(duì)。名稱31七、
JSON如:{"employees":[{"name":"zhangsan","age":"21"},{"name":"lisi","age":"30"},{"name":"wangwu","age":"25"}]}七、JSON如:32七、
JSON2.JSON解析JSONObject代表了一個(gè)待解析的名稱/值對(duì)集合,使用JSONObjectjsonObject=newJSONObject(data)此語(yǔ)句獲得JSONObject對(duì)象。如果值為基本數(shù)據(jù)類型時(shí),然后使用相應(yīng)的getx()方法了取值。七、JSON2.JSON解析33七、
JSON【例11.5】編程解析下面Json數(shù)據(jù):【說(shuō)明】使用JSONObject封裝上述JSON數(shù)據(jù),然后使用相應(yīng)的getX()方法取得各個(gè)具體的值。七、JSON【例11.5】編程解析下面Json數(shù)據(jù):34【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬器,接著運(yùn)行JSONObject_test項(xiàng)目,運(yùn)行時(shí)顯示效果如圖11-12所示,點(diǎn)擊“開始解析”按鈕的顯示效果如圖11-13所示。
圖11-12項(xiàng)目效果
圖11-13
解析結(jié)果
【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬35八、本章小結(jié)
本章主要講Android應(yīng)用程序開發(fā)中網(wǎng)絡(luò)連接協(xié)議、網(wǎng)絡(luò)連接狀態(tài)、網(wǎng)絡(luò)連接數(shù)據(jù)交互、網(wǎng)絡(luò)數(shù)據(jù)處理等。本章還介紹了GET方式與POST方式兩種網(wǎng)絡(luò)請(qǐng)求的區(qū)別,最后介紹了JSON的定義,并通過(guò)案例講解了JSON解析過(guò)程。八、本章小結(jié)
本章主要講Android應(yīng)用程序開發(fā)中網(wǎng)絡(luò)連接36ThankyouThankyou37第十一章:網(wǎng)絡(luò)編程
第十一章:網(wǎng)絡(luò)編程38
HTTP協(xié)議Handle消息機(jī)制原理
Asynctask網(wǎng)絡(luò)狀態(tài)
HttpURLConnection訪問(wèn)網(wǎng)絡(luò)數(shù)據(jù)提交方式JSON解析本章小結(jié)目錄HTTP協(xié)議Handle消息機(jī)制原理Asynctask網(wǎng)39一、HTTP協(xié)議WWW是以Internet作為傳輸媒介的一個(gè)應(yīng)用系統(tǒng),WWW網(wǎng)上基本的傳輸單位是Web網(wǎng)頁(yè)。WWW的工作是基于客戶機(jī)/服務(wù)器計(jì)算模型,由Web瀏覽器和Web服務(wù)器構(gòu)成,兩者之間采用超文本傳輸協(xié)議HTTP進(jìn)行通信。HTTP協(xié)議時(shí)基于TCP/IP協(xié)議之上的協(xié)議,是Web瀏覽器和Web服務(wù)器之間的應(yīng)用層的協(xié)議,是通用的、無(wú)狀態(tài)的面向?qū)ο蟮膮f(xié)議。一、HTTP協(xié)議WWW是以Internet作為傳輸媒介的一個(gè)40一、HTTP協(xié)議例如在日常生活中,當(dāng)人們想看新聞時(shí)在手機(jī)瀏覽器輸入,即可進(jìn)入網(wǎng)易新聞,此訪問(wèn)過(guò)程是通過(guò)HTTP協(xié)議完成的,手機(jī)端訪問(wèn)服務(wù)器端的圖解過(guò)程如圖11-1所示。圖11-1HTT請(qǐng)求與響應(yīng)一、HTTP協(xié)議例如在日常生活中,當(dāng)人們想看新聞時(shí)在手機(jī)瀏覽41二、Handle消息機(jī)制原理在Android系統(tǒng)整體優(yōu)化性能的考慮,Android的UI操作是線程安全的,這樣導(dǎo)致有多個(gè)線程并發(fā)操作UI組件時(shí),可能出現(xiàn)線程安全問(wèn)題。當(dāng)應(yīng)用程序啟動(dòng)時(shí),會(huì)開啟一個(gè)主線程(也就是UI線程),由它來(lái)管理UI,監(jiān)聽用戶點(diǎn)擊,來(lái)響應(yīng)用戶并分發(fā)事件等。所以一般在主線程中不要執(zhí)行比較耗時(shí)的操作,如聯(lián)網(wǎng)下載數(shù)據(jù)等,否則出現(xiàn)ANR錯(cuò)誤。二、Handle消息機(jī)制原理在Android系統(tǒng)整體優(yōu)化性能42二、Handle消息機(jī)制原理注意:線程安全是指多線程訪問(wèn)時(shí),采用加鎖機(jī)制,當(dāng)一個(gè)線程訪問(wèn)該類的某個(gè)數(shù)據(jù)時(shí),對(duì)數(shù)據(jù)進(jìn)行保護(hù),其他線程不能進(jìn)行訪問(wèn),直到該線程讀取完,這樣做的目的是不會(huì)出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。線程不安全是指多線程訪問(wèn)時(shí),不提供數(shù)據(jù)訪問(wèn)保護(hù),有可能出現(xiàn)多個(gè)線程先后更改數(shù)據(jù)造成所得到的數(shù)據(jù)可能是臟數(shù)據(jù)。二、Handle消息機(jī)制原理注意:43二、Handle消息機(jī)制原理
Handler類主要做兩件事:一是在新啟動(dòng)的子線程中發(fā)送消息;二是在主線程中獲取、處理消息。主線程處理新的子線程發(fā)送過(guò)來(lái)的消息,主要是通過(guò)回調(diào)方法來(lái)實(shí)現(xiàn)程序開發(fā)者重寫Handler類處理消息方法,當(dāng)新的子線程發(fā)送消息過(guò)來(lái)后,消息會(huì)與關(guān)聯(lián)的MessageQueue綁定,而Handler將從MessageQueue中獲取消息。二、Handle消息機(jī)制原理
Handler類主要做兩件事44二、Handle消息機(jī)制原理
Handler機(jī)制主要包括4個(gè)對(duì)象,分別是Message、MessageQueue、Handler、Looper。Message:包含描述和任意數(shù)據(jù)對(duì)象的消息,用于發(fā)送給Handler。它主要在不同線程間進(jìn)行數(shù)據(jù)交換。MessageQueue:是指消息隊(duì)列,它主要用來(lái)接收Handler發(fā)送過(guò)來(lái)的消息,這些消息存放在MessageQueue中等待處理。Handler:是指發(fā)送消息與處理消息的對(duì)象。Looper:是每個(gè)線程中的MessageQueue管理者。二、Handle消息機(jī)制原理
Handler機(jī)制主要包括4個(gè)45二、Handle消息機(jī)制原理Handler處理消息的步驟如下:(1)在Activity中聲明Handler對(duì)象,然后重寫handleMessage()方法。(2)在新啟動(dòng)的線程中調(diào)用sendMessage()或sendEmptyMessage()方法向Handler發(fā)送消息。(3)在Handler對(duì)象中使用handleMessage()方法接收消息,然后根據(jù)消息做后續(xù)操作處理。二、Handle消息機(jī)制原理Handler處理消息的步驟如46二、Handle消息機(jī)制原理Handler的常用方法及說(shuō)明。方法說(shuō)明voidhandleMessage(Messagemsg)消息發(fā)送后在這個(gè)方法中接收處理booleansendMessage(Messagemsg)發(fā)送消息到HandlerbooleansendEmptyMessage(intwhat)發(fā)送只有一個(gè)what值的消息booleansendMessageDelayed(Messagemsg,longdelayMillis)延時(shí)發(fā)送消息voidremoveMessages(intwhat)刪除消息/取消定時(shí)消息表11-1Handler的常用方法二、Handle消息機(jī)制原理Handler的常用方法及說(shuō)明47二、Handle消息機(jī)制原理
當(dāng)MessageQueue有消息進(jìn)來(lái)時(shí),將它取出并傳遞給Handler的handleMessage()方法。在主線程創(chuàng)建Handler對(duì)象時(shí),系統(tǒng)已經(jīng)創(chuàng)建了Looper對(duì)象,不需要程序開發(fā)者手動(dòng)創(chuàng)建。Handler消息處理流程如下圖11-2所示。二、Handle消息機(jī)制原理
當(dāng)MessageQueue48二、Handle消息機(jī)制原理
從圖11-2可以看到整個(gè)Handler消息處理流程。先在UI線程中創(chuàng)建一個(gè)Handler對(duì)象,然后在子線程中使用Handler的sendMessage()方法,接著將此消息存放到MessageQueue中,之后使用Looper對(duì)象取出MessageQueue中的消息,最后發(fā)送給Handler對(duì)象的handleMessage()方法做后續(xù)操作處理。圖11-2Handler消息處理流程二、Handle消息機(jī)制原理
從圖11-2可以看到整個(gè)49
二、Handle消息機(jī)制原理
【例11.1】通過(guò)Handler實(shí)現(xiàn)每隔1S鐘更換一個(gè)TextView背景色一次,并在TextView中設(shè)置文字顯示的內(nèi)容為當(dāng)前的顏色?!菊f(shuō)明】本例主要使用兩個(gè)類,一個(gè)是繼承Activity的類,在其中聲明Handler對(duì)象,并重寫handleMessage()方法,在此方法中根據(jù)消息的值來(lái)更改TextView背景色以及文字的內(nèi)容;另一個(gè)是繼承Thread的類,并重寫run()方法,在此類下使用sendEmptyMessage()方法向Handler發(fā)送消息。
二、Handle消息機(jī)制原理
【例11.1】通過(guò)Hand50二、Handle消息機(jī)制原理【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬器,接著運(yùn)行Handler_test項(xiàng)目,顯示效果如圖11-3所示,點(diǎn)擊“啟動(dòng)”按鈕后的效果如圖11-4所示。圖11-3運(yùn)行效果圖11-4點(diǎn)擊“啟動(dòng)”后效果二、Handle消息機(jī)制原理【運(yùn)行結(jié)果】在Eclipse51三、Asynctask
Asynctask是抽象類,創(chuàng)建一個(gè)類繼承此類時(shí),可以指定三個(gè)泛型參數(shù),這個(gè)三個(gè)參數(shù)的作用分別如下:Params:在執(zhí)行Asynctask時(shí)需要傳入的參數(shù),用于后臺(tái)任務(wù)中使用。比如HTTP請(qǐng)求的URL。Progress:在后臺(tái)任務(wù)執(zhí)行時(shí),如果需要的界面上顯示進(jìn)度,此參數(shù)將作為百分比。Result:后臺(tái)執(zhí)行任務(wù)最終返回的結(jié)果,比如String類型。三、Asynctask
Asynctask是抽象類,創(chuàng)建一52三、Asynctask
Asynctask的執(zhí)行過(guò)程分以下四個(gè)步驟,每一步對(duì)應(yīng)一個(gè)回調(diào)方法。(1)onPreExecute(),此方法在執(zhí)行后臺(tái)操作前被主線程調(diào)用??梢栽诖朔椒ㄖ凶鲆恍┣捌跍?zhǔn)備工作,如顯示一個(gè)進(jìn)度條。(2)doInBackground(Params…),此方法在onPreExecute()方法執(zhí)行后馬上執(zhí)行,在后臺(tái)線程中運(yùn)行,這里主要用來(lái)處理一些耗時(shí)操作。注意,此方法是抽象方法,子類必須實(shí)現(xiàn)它。在這個(gè)方法中可以使用publicProgress(Progress…)來(lái)更新任務(wù)的進(jìn)度。三、Asynctask
Asynctask的執(zhí)行過(guò)程分以下53三、Asynctask(3)onProgressUpdate(Progress…),在publishProgress(Progress…)方法被調(diào)用后,UI線程將調(diào)用此方法來(lái)更新界面展示任務(wù)的進(jìn)度,方法中攜帶的參數(shù)是后臺(tái)任務(wù)中傳遞過(guò)來(lái)的數(shù)據(jù)。(4)onPostExecute(Result),在doInBackground()方法執(zhí)行完成后返回的參數(shù)傳遞到此方法中,進(jìn)行后續(xù)處理,如提醒當(dāng)前任務(wù)已經(jīng)完成。三、Asynctask(3)onProgressUpdate54三、Asynctask
Asynctask的執(zhí)行過(guò)程如圖11-5所示。圖11-5Asynctask的執(zhí)行過(guò)程三、Asynctask
Asynctask的執(zhí)行過(guò)程如圖55三、AsynctaskAsynctask的使用還要用到一些其他方法,如表11-2所示。
表11-2Asynctask的常用方法方法說(shuō)明AsyncTaskexecute(Params...params)開啟任務(wù)booleancancel(booleanmayInterruptIfRunning)取消任務(wù)的執(zhí)行AsyncTask.StatusgetStatus()獲取任務(wù)的當(dāng)前狀態(tài)booleanisCancelled()如果任務(wù)正常后取消任務(wù)返回true,否則為false三、AsynctaskAsynctask的使用還要用到一些56三、Asynctask
【例11.2】通過(guò)Asynctask求用戶輸入一個(gè)數(shù)內(nèi)的所包含的合數(shù),并把這些合數(shù)顯示在用戶界面上。
【說(shuō)明】本例主要使用Asynctask類的四個(gè)方法,onPreExecute()方法控制按鈕的可用狀態(tài),
onPostExecute(Result)方法輸出最終結(jié)果,doInBackground(Params…)與onProgressUpdate
(Progress…)實(shí)時(shí)處理得到的合數(shù)并顯示在用戶界面上。
三、Asynctask
【例11.2】通過(guò)Asynctask57三、Asynctask
【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬器,接著運(yùn)行Asynctask_test項(xiàng)目,顯示效果如圖11-6所示,輸入100,點(diǎn)擊“開始計(jì)算”按鈕后的效果如圖11-7所示。圖11-6運(yùn)行效果圖11-7“開始計(jì)算”效果三、Asynctask
【運(yùn)行結(jié)果】在Eclipse中啟58四、網(wǎng)絡(luò)狀態(tài)
現(xiàn)在大量的Android應(yīng)用程序需要在網(wǎng)絡(luò)上獲取數(shù)據(jù),但是在獲取網(wǎng)絡(luò)數(shù)據(jù)之前,先要對(duì)數(shù)據(jù)狀態(tài)進(jìn)行判斷,這樣可以提升用戶體驗(yàn)。網(wǎng)絡(luò)使用的場(chǎng)景:用戶界面上需要表述當(dāng)前網(wǎng)絡(luò)狀態(tài);Android應(yīng)用程序后臺(tái)要根據(jù)不同的網(wǎng)絡(luò)狀態(tài)來(lái)處理數(shù)據(jù);Android應(yīng)用程序后臺(tái)要根據(jù)網(wǎng)絡(luò)情況來(lái)開啟相關(guān)服務(wù)。四、網(wǎng)絡(luò)狀態(tài)
現(xiàn)在大量的Android應(yīng)用程序需要在網(wǎng)絡(luò)59四、網(wǎng)絡(luò)狀態(tài)
獲取網(wǎng)絡(luò)服務(wù)的步驟:(1)獲得系統(tǒng)服務(wù)。ConnectivityManager負(fù)責(zé)管理所有的連接服務(wù)。使用getSystemService()獲得系統(tǒng)服務(wù),系統(tǒng)服務(wù)包括3G/4G、WiFi、藍(lán)牙服務(wù)。(2)獲得網(wǎng)絡(luò)服務(wù)。通過(guò)ConnectivityManager的getActiveNetworkInfo()方法獲得NetworkInfo類,此類即可用來(lái)檢測(cè)網(wǎng)絡(luò)的狀態(tài)與類型。四、網(wǎng)絡(luò)狀態(tài)
獲取網(wǎng)絡(luò)服務(wù)的步驟:60四、網(wǎng)絡(luò)狀態(tài)【例11.3】判斷當(dāng)前手機(jī)的網(wǎng)絡(luò)連接狀態(tài)與類型。
【說(shuō)明】本例通過(guò)使用ConnectivityManager.
getA-ctiveNetworkInfo()方法獲得NetworkInfo類,然后檢測(cè)網(wǎng)絡(luò)連接狀態(tài)與類型。四、網(wǎng)絡(luò)狀態(tài)【例11.3】判斷當(dāng)前手機(jī)的網(wǎng)絡(luò)連接狀態(tài)與類型。61四、網(wǎng)絡(luò)狀態(tài)【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Android模擬器,接著運(yùn)行NetworkConnectivity_test項(xiàng)目,移動(dòng)網(wǎng)絡(luò)打開時(shí)的顯示效果如圖11-8所示,WiFi打開時(shí)的顯示效果如圖11-9所示。圖11-8移動(dòng)網(wǎng)絡(luò)效果圖11-9WIFI打開效果四、網(wǎng)絡(luò)狀態(tài)【運(yùn)行結(jié)果】在Eclipse中啟動(dòng)Andr62五、HttpURLConnection訪問(wèn)網(wǎng)絡(luò)
在Android開發(fā)應(yīng)用中,大量應(yīng)用程序需要與服務(wù)器進(jìn)行數(shù)據(jù)交互,此時(shí)就可以使用HttpURLConnection對(duì)象。HttpURLConnection的通信基本流程:1.創(chuàng)建URL;2.創(chuàng)建HttpURLConnection;3.設(shè)置HttpURLConnection請(qǐng)求參數(shù);4.URLConnection建立連接;5.HttpURLConnection發(fā)送請(qǐng)求;6.HttpURLConneciton獲取響應(yīng)。五、HttpURLConnection訪問(wèn)網(wǎng)絡(luò)
在Andro63【例11.4】從網(wǎng)絡(luò)獲取一個(gè)圖片并顯示在Android應(yīng)用程序界面上。
【說(shuō)明】訪問(wèn)網(wǎng)絡(luò)資源使用HttpURLConnection對(duì)象來(lái)進(jìn)行通信。結(jié)果如下圖所示:圖11-10運(yùn)行時(shí)項(xiàng)目效果圖11-11“提交”后效果【例11.4】從網(wǎng)絡(luò)獲取一個(gè)圖片并顯示在Android應(yīng)用程64六、數(shù)據(jù)提交方式HTTP/1.1協(xié)議規(guī)定的HTTP請(qǐng)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學(xué)三年級(jí)(動(dòng)車組檢修技術(shù))動(dòng)車組檢修試題及答案
- 2025年大學(xué)精細(xì)化工技術(shù)(分離技術(shù))模擬試題
- 2025年中職建筑機(jī)械安裝(建筑機(jī)械安裝)試題及答案
- 2025年大學(xué)本科(會(huì)計(jì)學(xué))財(cái)務(wù)共享應(yīng)用階段測(cè)試題及答案
- 2025年高職(護(hù)理)重癥護(hù)理實(shí)務(wù)階段測(cè)試題及答案
- 2025年中職休閑體育(健身指導(dǎo)方法)試題及答案
- 2025年中職第二學(xué)年(健身休閑服務(wù))健身俱樂(lè)部管理實(shí)操測(cè)試卷
- 2025年大學(xué)旅游管理(旅游學(xué)原理)試題及答案
- 2025年高職數(shù)字媒體藝術(shù)設(shè)計(jì)(數(shù)字設(shè)計(jì))試題及答案
- 2025年高職測(cè)繪工程技術(shù)(GIS技術(shù)應(yīng)用)試題及答案
- 2026年高考化學(xué)模擬試卷重點(diǎn)知識(shí)題型匯編-原電池與電解池的綜合
- 2025青海省生態(tài)環(huán)保產(chǎn)業(yè)有限公司招聘11人筆試歷年參考題庫(kù)附帶答案詳解
- 2025浙江杭州錢塘新區(qū)建設(shè)投資集團(tuán)有限公司招聘5人筆試參考題庫(kù)及答案解析
- 2025年天津市普通高中學(xué)業(yè)水平等級(jí)性考試思想政治試卷(含答案)
- 2025年昆明市呈貢區(qū)城市投資集團(tuán)有限公司及下屬子公司第二批招聘(11人)備考核心題庫(kù)及答案解析
- 2025年中國(guó)磁懸浮柔性輸送線行業(yè)市場(chǎng)集中度、競(jìng)爭(zhēng)格局及投融資動(dòng)態(tài)分析報(bào)告(智研咨詢)
- 腦膜瘤患者出院指導(dǎo)與隨訪
- 學(xué)堂在線 雨課堂 學(xué)堂云 科研倫理與學(xué)術(shù)規(guī)范 期末考試答案
- 2026年武漢大學(xué)專職管理人員和學(xué)生輔導(dǎo)員招聘38人備考題庫(kù)必考題
- 唇腭裂序列治療課件
- 2025年充電樁運(yùn)營(yíng)市場(chǎng)調(diào)研:快充樁需求與盈利模式分析
評(píng)論
0/150
提交評(píng)論