從HTTP手動連接到Retorfit框架連接網(wǎng)絡(luò)

這篇文章首先展示如何以最簡單的方式通過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)接口阻星,并包含兩個方法 onResonseonFailure,若成功在第一個方法中可以可以用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 請求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載芽偏,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者雷逆。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市污尉,隨后出現(xiàn)的幾起案子膀哲,更是在濱河造成了極大的恐慌,老刑警劉巖被碗,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件某宪,死亡現(xiàn)場離奇詭異,居然都是意外死亡锐朴,警方通過查閱死者的電腦和手機兴喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焚志,“玉大人衣迷,你說我怎么就攤上這事〗闯辏” “怎么了壶谒?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膳沽。 經(jīng)常有香客問我佃迄,道長,這世上最難降的妖魔是什么贵少? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任呵俏,我火速辦了婚禮,結(jié)果婚禮上滔灶,老公的妹妹穿的比我還像新娘普碎。我一直安慰自己,他們只是感情好录平,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布麻车。 她就那樣靜靜地躺著缀皱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪动猬。 梳的紋絲不亂的頭發(fā)上啤斗,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音赁咙,去河邊找鬼钮莲。 笑死,一個胖子當著我的面吹牛彼水,可吹牛的內(nèi)容都是我干的崔拥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凤覆,長吁一口氣:“原來是場噩夢啊……” “哼链瓦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盯桦,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慈俯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拥峦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肥卡,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年事镣,在試婚紗的時候發(fā)現(xiàn)自己被綠了步鉴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡璃哟,死狀恐怖氛琢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情随闪,我是刑警寧澤阳似,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站铐伴,受9級特大地震影響撮奏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜当宴,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一畜吊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧户矢,春花似錦玲献、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓢娜。三九已至,卻和暖如春礼预,著一層夾襖步出監(jiān)牢的瞬間眠砾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工托酸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褒颈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓获高,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吻育。 傳聞我的和親對象是個殘疾皇子念秧,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)布疼,斷路器摊趾,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評論 25 707
  • Retrofit是squareup公司的開源力作砾层,和同屬squareup公司開源的OkHttp,一個負責網(wǎng)絡(luò)調(diào)度贱案,...
    藍灰_q閱讀 41,488評論 23 281
  • 相信很多人都在使用Retrofit肛炮,我也在用,但是對它的理解都不是太深刻宝踪,現(xiàn)在Retrofit2已經(jīng)出來一段時間侨糟,...
    WHOKNOWME閱讀 7,495評論 6 19
  • 周末,爸爸媽媽開車帶著我和姐姐去了花都海洋世界瘩燥。 一進花花世界門口抬頭就看見一只肥嘟嘟的大企鵝在...
    賴俊宇閱讀 190評論 0 0