總結(jié):學習了在Android中使用HTTP協(xié)議來進行網(wǎng)絡(luò)交互的知識,雖然Android支持的網(wǎng)絡(luò)協(xié)議有很多種,但是HTTP協(xié)議最為常用,學習了發(fā)送HTTP請求的兩種方式---HttpURLConnnection/OkHttp,因為服務(wù)器響應(yīng)我們的數(shù)據(jù)一般是XML和JSON格式數(shù)據(jù),所以學習了XML和JSON格式數(shù)據(jù)的解析方式(,XML和JSON格式數(shù)據(jù)的解析方式分別學了Pull/SAX和JSONObject/GSON).還學了如何利用java的回調(diào)機制來將服務(wù)器相應(yīng)的數(shù)據(jù)進行返回----要做到舉一反三
在網(wǎng)絡(luò)上傳輸數(shù)據(jù)最常用的格式有兩種:XML和JSON
XML解析
需要先解決一個問題,我們需要解析一段數(shù)據(jù)首先我們應(yīng)該先獲取一段XML形式數(shù)據(jù),(那么我們從哪里獲得一段XML格式的數(shù)據(jù)呢?)我們先搭建一個簡單的Web服務(wù)器,在服務(wù)器上提供一段XML文本,然后我們在程序里去訪問這個服務(wù)器,在對得到的xml數(shù)據(jù)進行解析.
Apache服務(wù)器
搭建Web服務(wù)器其實非常簡單,有很多的服務(wù)器類型可以選擇,我們在這里選擇Apache服務(wù)器.具體的教程可以參考https://jingyan.baidu.com/album/d8072ac47baf0eec95cefdca.html?picindex=9我自己的安裝目錄為:D:\application_software\Apache在D:\application_software\Apache\htdocs目錄下新建一個名字為get_data.xml的文件.寫下如下內(nèi)容:
然后在瀏覽器中訪問http://127.0.0.1/get_data.xml這個網(wǎng)址出現(xiàn)內(nèi)容如下:
解析XML格式數(shù)據(jù)的方法-------Pull和SAX
首先將Http請求的地址改成了http://211.67.16.16/get_data.xml,211.67.16.16對于模擬器來說就是電腦本機的IP地址(注意這個跟第一行代碼的書上是不一樣的,因為不同的電腦具有不同的IP地址,查看電腦IP地址的方法具體可以參考https://jingyan.baidu.com/article/851fbc370cc6613e1e15ab7e.html)
運行項目并觀察logcat發(fā)現(xiàn)下圖,表明了我們已經(jīng)將XML數(shù)據(jù)中的指定內(nèi)容成功解析出來了.
SAX解析方式
SAX解析方式也是一種特別常用的XML解析方式,他的用法可能會比Pull解析要復雜一些,但是它的語義要比Pull解析更清楚.
一般的步驟為新建一個類去繼承DefaultHandler類,并重寫父類的5個方法(注意在Android Studio中的這種情況是不會alt+enter出現(xiàn)重寫的方法的所以需要我們記住這幾個方法分別是startDocument()?startElement()?characters()?endElement()?endDocument() )
startDocument():會在開始XML解析的時候調(diào)用
startElement():會在開始解析某個節(jié)點的時候調(diào)用
characters():會在獲取節(jié)點中內(nèi)容的時候調(diào)用
endElement():會在完成解析某個節(jié)點的時候調(diào)用
endDocument():會完成整個XML解析的時候調(diào)用
startElement()?characters()?endElement()這三個方法是有參數(shù)的,從xml中解析出的數(shù)據(jù)會以參數(shù)的形式傳入到這些方法之中.需要注意的是,在獲取節(jié)點中的內(nèi)容時,characters()方法可能會被調(diào)用多次,一些換行符也被當做內(nèi)容解析出來,我們需要在代碼中加以控制.
接下來的工作便很簡單了.
觀察logcat日志發(fā)現(xiàn),結(jié)果與預期吻合
解析JSON格式數(shù)據(jù)
與XML相比JSON的主要優(yōu)勢在于其體積小,在網(wǎng)絡(luò)傳輸方面可以更省流量,缺點在于語義性較差,看起來不如xml直觀.
新建get_data.json文件如下圖所示:
瀏覽器中訪問http://127.0.0.1/get_data.json,
解析JSON可以用官方推介的JSONObject也可以使用谷歌的開源庫GSON(推介使用GSON實在是太簡單了都給你封裝好了,接口也弄好了)
使用JSONObject
logcat內(nèi)容如下:與預期結(jié)果相吻合.
使用GSON(強烈推介使用)
不過GSON并沒有被添加到Android官方的API中,所以如果想用這個功能的話需要在項目中添加GSON庫的依賴
編輯app/build.gradle文件在dependencies閉包中添加如下內(nèi)容:compile'com.google.code.gson:gson:2.7'.
GSON庫可以將一段JSON格式的字符串自動映射成一個對象,從而不需要我們再手動去編寫代碼進行解析了.
先定義一個類設(shè)置好相關(guān)的字段
以上的所有內(nèi)容都不要忘了添加網(wǎng)絡(luò)請求在AndroidManifest.xml文件中,否則會報錯.<uses-permission android:name="android.permission.INTERNET"/>閉包中還用到了OkHttp,不要忘記添加implementation'com.squareup.okhttp3:okhttp:3.10.0'
搞懂http://211.67.16.16/get_data.xml和http://127.0.0.1/get_data.xml的區(qū)別
Apache服務(wù)器的默認主頁,為什么指定訪問的服務(wù)器地址是電腦本機?我們自己搭建好了Web服務(wù)器(服務(wù)器類型為Apache)為什么在代碼中不訪問這個服務(wù)器,而是訪問的本機IP地址???這兩者之間存在什么必然聯(lián)系??