版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第八章 網(wǎng)絡(luò)技術(shù)8.1 WebView簡介8.5 網(wǎng)絡(luò)編程優(yōu)化8.3 XML解析8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)8.4 JSON解析8.6 實(shí)戰(zhàn)演練故事匯8.7 小結(jié)8.1 WebView簡介Android是由互聯(lián)網(wǎng)巨頭公司Google開發(fā)的,因此Android對網(wǎng)絡(luò)功能的支持是必不可少的。作為開發(fā)者,需要考慮如何利用網(wǎng)絡(luò)來編寫更加出色的應(yīng)用程序,像微信、QQ、微博等常見應(yīng)用都會(huì)大量使用網(wǎng)絡(luò)技術(shù)。在編輯程序時(shí),我們根據(jù)特殊需求,有時(shí)需要在程序中展示網(wǎng)頁。Android系統(tǒng)為了滿足這樣的需求,提供了WebView控件,我們可以通過這個(gè)控件在我們的應(yīng)用程序中嵌入一個(gè)瀏覽器,輕松用于展示各種各樣的網(wǎng)頁。
2、8.1 WebView簡介WebView的用法很簡單,在布局activity_main.xml中添加控件獲取WerbView的實(shí)例后,通過實(shí)例調(diào)用getSetting()方法設(shè)置瀏覽器屬性,讓W(xué)ebView支持JavaScript腳本即可,因此調(diào)用setJavaScriptEnabled()方法。 /調(diào)用方法支持JavaScript腳本 wv.getSettings().setJavaScriptEnabled(true); /調(diào)用setWebViewClient()方法使目標(biāo)網(wǎng)頁在當(dāng)前窗口顯示 wv.setWebViewClient(new WebViewClient(); /設(shè)置打開網(wǎng)頁內(nèi)
3、容 wv.loadUrl();8.1 WebView簡介為了能夠讓本程序使用網(wǎng)絡(luò)功能,還需要聲明網(wǎng)絡(luò)訪問權(quán)限,因此我們在清單文件AndroidMenifest.xml中添加權(quán)限聲明:8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)所謂的HTTP(Hyper Test Transfer Protocal)即超文本傳輸協(xié)議,它規(guī)定了瀏覽器和服務(wù)器之間互相通信的規(guī)則。它的工作原理比較簡單,是一種請求/響應(yīng)式的協(xié)議,當(dāng)客戶端向服務(wù)器發(fā)出一條HTTP請求,服務(wù)器收到請求后會(huì)返回一些數(shù)據(jù)給客戶端,然后客戶端再對比這些數(shù)據(jù)進(jìn)行解析和處理即可。上一節(jié)案例中使用到的WebView控件,其實(shí)就是使用手機(jī)客戶端訪問百度服務(wù)器并發(fā)送了H
4、TTP請求,接著服務(wù)器分析出我們要訪問的是百度的首頁,接著做出響應(yīng)并將百度首頁數(shù)據(jù)返回給客戶端中調(diào)用了手機(jī)瀏覽器內(nèi)核的WebView并對返回?cái)?shù)據(jù)進(jìn)行解析,最終將頁面展示出來。8.2.1 HttpURLConnection的基本用法在Android系統(tǒng)上發(fā)送HTTP請求一般有兩種方式:HttpURLConection和HttpClientHttpClient方式存在API數(shù)量過多以及難擴(kuò)展等缺點(diǎn)在Android 6.0之后此功能被移除棄用實(shí)際開發(fā)中,絕大多數(shù)的App都需要與服務(wù)器進(jìn)行數(shù)據(jù)交換,也就是訪問網(wǎng)絡(luò),此時(shí)需要首先獲取到HttpURLConnection的實(shí)例:8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)
5、URL url = new URL(); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod(GET); /設(shè)置請求方式 conn.setConnectTimeout(2000); /設(shè)置超時(shí)時(shí)間 InputStream is = conn.getInputStream(); /獲取服務(wù)器返回輸入流 conn.disconnect(); /斷開連接8.2.2 GET和POST請求方式獲取到HttpURLConnection實(shí)例后,我們設(shè)置了HTTP請求所用的方法,常用的方
6、法主要有兩個(gè):GET和POSTGET表示希望從服務(wù)器那里獲取數(shù)據(jù)POST則表示希望提交數(shù)據(jù)給服務(wù)器8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)GET方式提交數(shù)據(jù)GET方式是以實(shí)體方式得到由請求URL所指向的資源信息,它向服務(wù)器提交的參數(shù)跟在請求URL后面/用戶名及密碼拼在指定路徑后面并進(jìn)行編碼String path = 11:8080/web/LoginServlet?username= + URLEncoder.encode(zhangsan) + &pswd = + URLEncoder.encode(admin); URL url = new URL(path); /創(chuàng)建URL對象 HttpURLCon
7、nection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod(GET); /設(shè)置請求方式 conn.setConnectTimeout(2000); /設(shè)置超時(shí)時(shí)間 int responseCode = conn.getResponseCode(); /獲取狀態(tài)碼 if(responseCode=200) /訪問成功返回200,否則一般為404或400 InputStream is = conn.getInputStream(); /獲取服務(wù)器輸入流 8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)8.1 WebView
8、簡介POST方式提交數(shù)據(jù)使用POST方式向服務(wù)器發(fā)送請求時(shí),需要在請求后面附加實(shí)體。它向服務(wù)器提交的參數(shù)在請求后的實(shí)體中且POST方式請求對URL的長度沒有限制。String path = 11:8080/web/LoginServlet; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod(POST); /設(shè)置請求方式 conn.setConnectTimeout(2000); /設(shè)置超時(shí)時(shí)間/準(zhǔn)備數(shù)據(jù)并為數(shù)據(jù)進(jìn)行編碼
9、String info = username= + URLEncoder.encode(zhangsan) + &pswd= + URLEncoder.encode(admin); /設(shè)置請求頭數(shù)據(jù)提交方式,此處為form表單方式 conn.setRequestProperty(Content-Type,application/x-www-form-urlencoded); /設(shè)置請求頭以及調(diào)教數(shù)據(jù)長度 conn.setRequestProperty(Content-Length,info.length() + ); /使用POST方式將數(shù)據(jù)寫給服務(wù)器,參數(shù)為true表示允許向外寫數(shù)據(jù) con
10、n.setDoOutput(true); /創(chuàng)建輸出流向服務(wù)器寫數(shù)據(jù) OutputStream os = conn.getOutputStream(); os.write(info.getBytes(); int responseCode = conn.getResponseCode(); if(responseCode=200) InputStream is = conn.getInputStream(); 8.2.3 實(shí)戰(zhàn)演練23功能描述:技術(shù)要點(diǎn):編輯布局編輯邏輯代碼,點(diǎn)擊按鈕發(fā)送請求開啟線程模式發(fā)送POST以及GET形式請求案例代碼(詳見教材P182P185)實(shí)現(xiàn)步驟: 請求響應(yīng) 使用
11、HttpHRLConnection的post形式發(fā)送請求使用HttpHRLConnection的get形式發(fā)送請求18.2 HTTP協(xié)議訪問網(wǎng)絡(luò)8.2.4使用OkHttp訪問網(wǎng)絡(luò) 在實(shí)際開發(fā)中,使用Android自帶的API與服務(wù)器通信并不是非常方便,我們也不是只能使用HttpURLConnection進(jìn)行網(wǎng)絡(luò)通信,許多出色的網(wǎng)絡(luò)通信庫都可以替代原生的HttpURLConnection,其中OkHttp就是出色的一個(gè)。 OkHttp是由Square公司開發(fā)的,OkHttp不僅在接口封裝上簡單易用,在底層實(shí)現(xiàn)也自成一派,已經(jīng)成為目前Android開發(fā)者首選的網(wǎng)絡(luò)通信庫。我們接下來將具體講解OkH
12、ttp的用法,OkHttp項(xiàng)目的地址是:/square/okhttp。8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)添加依賴庫首先創(chuàng)建OkHttpClient實(shí)例8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)dependencies implementation fileTree(include: *.jar, dir: libs) androidTestImplementation com.android.support.test.espresso:espresso-core:3.0.2 implementation com.squareup.okhttp3:okhttp:3.13.1OkHttpClient okHttpCl
13、ient = new OkHttpClient();發(fā)送HTTP請求,因此需要?jiǎng)?chuàng)建請求對象調(diào)用build()方法前連綴url()方法來豐富這個(gè)Request對象,設(shè)置目標(biāo)網(wǎng)址地址通過OkHttpClient對象調(diào)用newCall()方法來創(chuàng)建Call對象,并使用這個(gè)對象調(diào)用execute()方法來發(fā)送請求并獲取服務(wù)器返回?cái)?shù)據(jù)Response對象就是服務(wù)器返回?cái)?shù)據(jù),可以通過下列方式獲取具體服務(wù)器返回內(nèi)容8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)Request request = new Request.Builder().build();Request request = new Request.Builde
14、r().url().build();Response response = okHttpClient.newCall(request).execute(); String responseData = response.body().string();如果使用POST發(fā)送請求的話,我們需要構(gòu)建一個(gè)RequestBody對象用來存放要提交的數(shù)據(jù)在Request.Builder中調(diào)用post()方法將RequesBody對象傳入即可8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)RequestBody requestBody = new FormBody.Builder() .add(username,root) .
15、add(pswd,admin) .build();Request request1 = new Request.Builder() .url() .post(requestBody) .build();8.2 HTTP協(xié)議訪問網(wǎng)絡(luò)public class MainActivity extends AppCompatActivity implements View.OnClickListener Override public void onClick(View v) if(v.getId() = R.id.btn_send)/ sendRequestWHttpURLConnection();
16、sendRequestWOkHttp(); private void sendRequestWOkHttp() new Thread(new Runnable() Override public void run() try OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().url().build(); Response response = okHttpClient.newCall(request).execute(); String responseData = r
17、esponse.body().string(); showResponse(responseData); catch (Exception e) e.printStackTrace(); ).start(); 8.3 XML解析 當(dāng)前網(wǎng)絡(luò)上傳輸數(shù)據(jù)時(shí)常用的格式有兩種:XML和JSON。首先我們來學(xué)習(xí)一下XML格式數(shù)據(jù)的解析。XML文件現(xiàn)有解析方式有3種,分別是Pull解析、SAX解析以及DOM解析,比較常用的是Pull解析與SAX解析8.3 XML解析8.3.1 PULL解析Pull解析是一個(gè)開源的Java項(xiàng)目,既可以用于Android應(yīng)用,也可以用于JavaEE程序,Android已經(jīng)集成了
18、Pull解析器。使用Pull解析XML文檔時(shí),首先要?jiǎng)?chuàng)建XmlPullParser解析器,下面我們來了解一下XmlPullParser的常用屬性:XmlPullParser.START_DOCUMENT:XML文檔的開始XmlPullParser.END_DOCUMENT:XML文檔的結(jié)束。XmlPullParser.START_TAG:開始節(jié)點(diǎn),在XML文件中,除了文本之外,帶有尖括號(hào)的都是開始節(jié)點(diǎn),如.XmlPullParser.END_TAG:結(jié)束節(jié)點(diǎn),帶有都是結(jié)束節(jié)點(diǎn),如。8.3 XML解析8.3.2 SAX解析方式XML解析中除了Pull解析以外,SAX解析也是一種非常實(shí)用的解析方式
19、,但是解析方式相比Pull解析要復(fù)雜一些,語義更清楚。使用SAX解析時(shí)都會(huì)新建一個(gè)類繼承自DefaultHandler類,并重寫5個(gè)方法:tartDociment()方法在XML開始解析的時(shí)候調(diào)用startElement()方法在解析執(zhí)行到文檔的某個(gè)節(jié)點(diǎn)的時(shí)候調(diào)用characters()方法會(huì)在解析節(jié)點(diǎn)時(shí)獲取節(jié)點(diǎn)內(nèi)容的時(shí)候調(diào)endElement()方法會(huì)在完成節(jié)點(diǎn)解析的時(shí)候調(diào)用endDocument()方法會(huì)在完成整個(gè)XML文檔解析的時(shí)候調(diào)用8.4 JSON解析 JSON是最近幾年流行的一種新的數(shù)據(jù)格式,與XML非常相似,都是用來存儲(chǔ)數(shù)據(jù)的,但是相比XML,JSON的主要優(yōu)勢在于它的體積小、解
20、析速度快以及占用空間小,在網(wǎng)絡(luò)上傳輸?shù)臅r(shí)候可以節(jié)省流量。但同時(shí)也存在一些缺點(diǎn),它的語義性較差,看起來沒有xml直觀。8.4 JSON解析8.4.1 JSON數(shù)據(jù)JSON即JavaScript Object Notation(對象表示法),是一種輕量級(jí)的數(shù)據(jù)交換格式,他是基于JavaScript的一個(gè)子集,使用了類似于C語言家庭的習(xí)慣(包括C、C+、C#、Java、JavaScript、Python等)JSON也是基于純文本的數(shù)據(jù)格式,并且JSON的數(shù)據(jù)格式非常簡單,初學(xué)者可以使用JSON傳輸一個(gè)簡單的String、Number、Boolean,也可以傳輸數(shù)組或者復(fù)雜的Object對象。8.4
21、JSON解析8.4.1 JSON數(shù)據(jù)JSON有下列兩種數(shù)據(jù)格式:對象結(jié)構(gòu)數(shù)組結(jié)構(gòu)8.4 JSON解析8.4.2 使用org.json解析JSON數(shù)據(jù)Android SDK中為開發(fā)者提供了org.json用來解析JSON數(shù)據(jù)由于JSON數(shù)據(jù)只有JSON對象和JSON數(shù)組兩種結(jié)構(gòu),因此org.json包提供了JSONObject和JSONArray兩個(gè)類對JSON數(shù)組進(jìn)行解析。要解析的JSON數(shù)據(jù)如下所示:使用JSONObject解析JSON對象“name”:”Lucy”,”age”:30,”married”:true /json1 對象形式16,2,26 /json2 數(shù)組形式JSONObjec
22、t jsonObj = new JSONObject(json1);String name = jsonObj.optString(“name”);int age = jsonObj.optInt(“age”);boolean married = jsonObj.optBpplean(“married”);8.4 JSON解析使用JSONArray解析JSON數(shù)組JSONArray jsonArray = new JSONArray(json2);for(int i=0;ijsonArray.length();i+) int age = jsonArray.optint(i);8.4 JSON解析例如下列數(shù)據(jù):需要解析的是JSON數(shù)組的話,借助TypeToken類將期望解析成的數(shù)據(jù)類型傳入到fromJson()方法中,過程如下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物料搬運(yùn)設(shè)備的能效提升與節(jié)能減排-洞察分析
- 營養(yǎng)素對頸部燒傷后傷口愈合的促進(jìn)-洞察分析
- 文化金融產(chǎn)品體系構(gòu)建-洞察分析
- 網(wǎng)紅經(jīng)濟(jì)效應(yīng)評(píng)估-洞察分析
- 《SIYB中國項(xiàng)目介紹》課件
- 勤儉節(jié)約的精彩講話稿(12篇)
- 辦公空間設(shè)計(jì)的多元素文化融合與創(chuàng)新
- 健康飲食文化在家庭教育中的傳播與影響研究
- 2025簡單采購合同范本
- 關(guān)于孩子在競爭環(huán)境下自信心建立的研究
- 鞋柜管理統(tǒng)一規(guī)定
- 危險(xiǎn)物品安全管理制度
- 《美麗的草原我的家》-完整版PPT
- 電力工程售后服務(wù)方案
- 幼兒園大班體育《學(xué)做解放軍》教案
- 2022年北京市高校教師崗前培訓(xùn)考試閉卷真題及答案整理
- 接地裝置試驗(yàn)作業(yè)指導(dǎo)書
- 手術(shù)通知單模板
- 網(wǎng)絡(luò)拓?fù)鋱D常用圖標(biāo)新版
- 《互聯(lián)網(wǎng)金融》試題A及參考答案
- artcam2008軟件及使用artcam的安裝和破解
評(píng)論
0/150
提交評(píng)論