這篇文章首先展示如何以最簡單的方式通過http協(xié)議在app上與網(wǎng)絡(luò)連接,并進行Json解析。在此基礎(chǔ)之上劳跃,了解了基本HttpURLConnection連接過程后,我們知道現(xiàn)在有很多框架比如OkHttp浙垫,Volley刨仑,Retrofit都支持連網(wǎng)和數(shù)據(jù)解析操作,這里我選擇Retrofit進行學習了解夹姥。
Http基礎(chǔ)聯(lián)網(wǎng)篇
添加許可
在項目的manifest中添加許可:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
檢查網(wǎng)絡(luò)連接
設(shè)備可能在網(wǎng)絡(luò)范圍之外杉武,或者連接網(wǎng)絡(luò)失敗。所以首先需要檢查網(wǎng)絡(luò)是否可用佃声,可以通過以下兩個方法: getActiveNetworkInfo()和 isConnected()艺智。
在子線程中進行網(wǎng)絡(luò)操作
從Android3.0(API level 11)之后倘要,為了防止ANR的發(fā)生圾亏,Android不允許在主線程中進行網(wǎng)絡(luò)操作十拣,如果在主線程中進行,將會產(chǎn)生NetworkOnMainThreadException異常志鹃。
在上面的代碼中夭问,類DownloadWebpageTask是類AsyncTask的一個子類,該類實現(xiàn)了AsyncTask的兩個方法:
- doInBackground(): 執(zhí)行方法 downloadUrl()曹铃,這個方法以 url為參數(shù)缰趋,該方法連接并取得網(wǎng)頁內(nèi)容,當它執(zhí)行結(jié)束時陕见,返回一個string字符串
- onPostExecute(): 得到返回的string字符串秘血,并顯示在UI上
連接網(wǎng)絡(luò)并得到數(shù)據(jù)
在子線程中,通過 HttpURLConnection 的 get 方法創(chuàng)建對象评甜,并通過 connect() 方法連接網(wǎng)絡(luò)后灰粮,通過 getInputStream() 方法獲得 輸入流InputStream。
注意忍坷,其中方法 getResponseCode() 返回連接的狀態(tài)碼粘舟,狀態(tài)碼可以有效的反應(yīng)出連接的附加信息,比如:200表示網(wǎng)絡(luò)連接成功佩研。
將輸入流InputStream轉(zhuǎn)化為字符串String
下載后得到的輸入流是byte流柑肴,得到輸入流后,可以將它轉(zhuǎn)化為可讀的目標數(shù)據(jù)旬薯,比如圖像晰骑、文字等。
在上面的例子中袍暴,我們要得到的是字符串些侍,所以這個方法用于將輸入流轉(zhuǎn)化為字符串后顯示在UI上。
Json解析
Json是一種文本形式的數(shù)據(jù)交換格式政模,比XML更輕量岗宣,比二進制更容易閱讀和編寫,調(diào)用也更方便淋样。這個例子中從網(wǎng)頁得到的數(shù)據(jù)為Json字符串耗式,接下來要進行的就是解析,Android提供了四個不同的類來解析Json數(shù)據(jù)趁猴,分別為JSONArray刊咳、JSONObject、JSONString 和 JSONTokenizer儡司。
Json的解析非常重要娱挨,解析和生成方式很多,上面的例子所用的是自帶最基本的類進行的解析捕犬,但我們還可以用一些框架來提高效率跷坝,常用的類庫有:JSON-Java酵镜、Gson、Jackson柴钻、FastJson等淮韭。
我的Demo
這里的demo要演示的是:在編輯框中輸入要連接的網(wǎng)址url,點擊按鈕connect贴届,與網(wǎng)站連接并獲取數(shù)據(jù)靠粪,將取得的數(shù)據(jù)以字符串形式顯示在下面,最后進行json解析毫蚓,分別顯示key值對應(yīng)的value值占键。代碼在我的github上,點擊這里查看
Retrofit框架聯(lián)網(wǎng)篇
添加gradle
在項目的gradle中添加包元潘,因為這里后期設(shè)置的converter為gson捞慌,所以將converter-gson包也添加進來了
Retrofit介紹
Retrofit 是一個RESTful的HTTP網(wǎng)絡(luò)請求框架的封裝,是由Square公司開源的柬批,Retrofit 2.0之后啸澡,更是內(nèi)置了OkHttp,前者專注接口的封裝氮帐,后者專注網(wǎng)絡(luò)請求的高效嗅虏,應(yīng)用程序通過 Retrofit 請求網(wǎng)絡(luò),實際上是使用 Retrofit 接口層封裝請求參數(shù)上沐、Header皮服、Url 等信息,之后由 OkHttp 完成后續(xù)的請求操作参咙,在服務(wù)端返回數(shù)據(jù)之后龄广,OkHttp 將原始的結(jié)果交給 Retrofit,后者根據(jù)用戶的需求對結(jié)果進行解析的過程蕴侧。
更多介紹可以參考官網(wǎng)
Retrofit連接網(wǎng)絡(luò)
1择同、Retrofit 將 HTTP API封裝到了一個接口中,這個接口我們可以自己定義
可以看到净宵,這里可以設(shè)置Converter敲才,我這里用的是Gson解析
2、Retrofit 類實現(xiàn)前面定義的接口
3择葡、獲取接口中Call每一個 Call 都可以開啟一個同步或一部的HTTP請求
4紧武、每一個 Call 都可以開啟一個同步或一部的HTTP請求
- call.execute():同步方法,Android要求網(wǎng)絡(luò)連接在多線程中敏储,可以根據(jù)需求將此方法放在子線程中執(zhí)行
- call.enqueue():異步方法要求實現(xiàn)接口阻星,并包含兩個方法 onResonse和 onFailure,若成功在第一個方法中可以可以用response獲取想要的各種信息
至此網(wǎng)絡(luò)連接成功已添,并通過設(shè)置Converter的獲取到了Json解析后的數(shù)據(jù)妥箕,是不是十分簡潔番舆,前面長篇大論代碼無數(shù),這里幾行代碼就已經(jīng)實現(xiàn)矾踱,Retrofit框架還是十分強大的。這里我只介紹了Retrofit最簡單的功能和實現(xiàn)疏哗,也沒有講太多的原理呛讲,只是為了感受一下框架的簡便和強大,但也是冰山一角返奉,如果有興趣贝搁,大家可以自行深入學習。
參考資料
Connecting to the Network
Android - JSON Parser
Retrofit
用 Retrofit 2 簡化 HTTP 請求