Android 網絡請求改造之路

oex2000 7年前發布 | 16K 次閱讀 RxJava Retrofit Android開發 移動開發

今天給大家分享的主題是網絡請求框架,而今天的兩位主角分別是retrofit和rxjava。這是我在我現在的工作項目中所運用的網絡請求以及數據處理框架。我也觀察到群里很多同學也接觸了這兩個框架,我分享的是我對這兩個框架的淺見和使用心得,有不對和不足的地方希望能引起討論。

我每次在接觸一個新事物的時候,首先會在腦海里過三點:

  1. what(它是什么?)

  2. why(為什么用它?)

  3. how(如何用它?)

通過這三個點,把點連成線,慢慢就會熟悉它,最后就可以整合進自己的知識庫中。

what(它是什么?)

retrofit

它是square公司出產的又一個精品,它有著簡易的接口配置、強大的擴展支持、優雅的代碼結構等優質特點而受到廣泛的歡迎。retrofit是一個RESTful風格的HTTP網絡請求框架的封裝。 注意我這里并沒有說是網絡請求框架哦 ,主要原因是網絡請求的工作并不是retrofit來完成的。retrofit2.0開始內置了OKHttp,前者專注于接口的封裝,后者專注于高效的網絡請求,二者分工協作。就好像OKHttp是一款牛B的發動機,而retrofit是完美的汽車外殼和零部件,它不止使發動機的優秀性能完美發揮,還能方便我們改裝這輛汽車,成為我們的心愛之物。

rxjava

它是目前Android開發中熱門的函數庫。它專注于響應式編程,讓異步事件以序列的形式組織代碼。使你的思路能用清晰的代碼實現。這里的關鍵點是響應式編程,我在這按下不表,大家有興趣可以學習一下,能更方便你理解rxjava。

why(為什么用它?)

先給大家看一段代碼,這是我在2014年剛參加工作的時候寫的代碼,圖片中是定義了一個登錄請求方法,需要傳入請求參數和請求響應監聽,請求框架用的是volley。在這里我簡單介紹一些volley,它是Google在2013年推出的網絡通信框架,它可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖片。但是volley也有弊端,因為volley設計目標是非常適合去進行數據量不大,但通信頻繁的網絡操作,所以對于   大數據量的網絡操作,比如說下載/上傳文件等,Volley的表現就會非常糟糕。

這是請求方法的外部調用。第一個是登錄請求方法的外部調用,然后下面是實例化了一個網絡請求監聽,里面的邏輯是解析json數據,并做登錄相關邏輯,還得處理登錄請求可能帶來的異常

這是對返回數據進行解析。

從上面的代碼中可以看出一些弊端:

1. 比如我不想做煩瑣的json解析工作了(fastjson這些咱暫時不用討論),我想請求回來的數據能直接轉換成bean對象

2. 錯誤處理的代碼寫得到處都是,我想有一個統一的管理

3. 為了防止服務器返回給我們壞數據,我們得做很多容錯工作。

不止上面說的三點,后面工作中還遇到一些坑,比如:我在做文件上傳的時候真的很頭疼,因為volley不適合做文件上傳工作,寫了很多上傳相關的代碼;再比如說,當多個請求需要組成鏈式請求的時候,代碼會寫得很繁瑣,后面我都不想看了。所以后期的維護工作做了很多,基本是自己挖坑自己踩。而且一個公認的事實是,OKHttp相對于volley來說,性能還是要高出不少。

當我正在為自己挖的坑而苦惱的時候,retrofit和rxjava這兩個吊炸天的框架在國內慢慢流行起來,當我發現它能做什么,能解決我的許多實際問題的時候,心里面就在想:窩草?它還能這樣?。這就是我為什么要用retrofit和rxjava的原因。

how(如何用它?)

當我們了解了它是什么,并且說服自己去使用它的時候,我們就要看看它是怎么玩的,那種姿勢才是最佳體位。

先給大家看一看我的網絡請求所需要的幾個基本類。

一步步開始搭建,(添加一下所在類的圖片)在HttpMethod類中構建retrofit,簡單解釋一下這兩個轉換器。

結合rxjava創建一個請求observable,即被觀察者。這里支持設定請求數據的模板。剛才說到了被觀察者,就解釋一下被觀察者和觀察者。在rxjava中,一個很重要的概念就是觀察者模式。

用button來做比喻,observable是button的話,subscriber就是onclickListener。那他們的setOnclickListener方法是什么呢,我們后面再講。

創建了觀察者之后,我們就得制定一些訂閱關系了。RxJava 可以使用subscribeOn和observeOn這兩個方法完美處理被觀察者和觀察者的執行線程問題.

我們在沒有使用框架做http請求的時候我們需要new一個線程,然后才開始請求,因為網絡請求是耗時操作,而用了rxjava一切都變了只需一行代碼輕松切換線程調度,而切換到主線程就類似于之前用handler的操作,因為操作ui不能子線程完成。這里就有很大的魅力了,以前的線程代碼和headler代碼這么多行,現在就兩行了,并且還是鏈式調用,簡單明了邏輯清晰。

好了,現在看一下請求方法的封裝,我們先構建retrofit對象,然后設置請求參數,是以map的形式傳遞,然后實例化一個網絡請求的被觀察者(observable)并通過map修飾符,對基本數據類型轉換成具體數據類型。最后再進行被觀察者和觀察者的訂閱,就像button.setonclickListener()一樣。可以看到我在map方法中,我實例化了一個叫HttpFunc的類,我來介紹一下這個類是干什么的。

我在HttpMethod中定義了一個內部類,實現了Func1接口,便于對數據做一些統一處理,把我們關心的具體數據部分剝離出來,而且還可以處理請求的異常。Func1是rxjava的一個有返回值的接口,作用是實現有數據的回調。

如何去用?

接下來就是外部調用請求方法啦,這里我傳入了兩個對象,一個是model的監聽器,還有一個是網絡請求的觀察者,那他們是如何工作的呢?

首先先來看自定義觀察者,也就是類似于button的onclicklistener,他繼承了rxjava的subscriber(觀察者),我在這里重寫了父類的方法,以實現擴展。然后把傳進來的自定義監聽實例化,便于監聽數據。

這就是我定義的model數據監聽,它能監聽到界面關心的具體data數據以及網絡請求的異常。就像層層傳遞一樣,把我們關心的數據一層層的往上拋。

最后我們再來對比一下,改造前和改造后代碼。

改造前Volley請求代碼

Android 網絡請求改造之路

改造后Retrofit+Rxjava代碼

Android 網絡請求改造之路

Android 網絡請求改造之路

Android 網絡請求改造之路

 

來自:http://url.cn/45QdWig

 

 本文由用戶 oex2000 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!