教你寫Android網路框架之基本架構
前言
在開發過程中,網路是我們很重要的一部分,因此我們就以網路框架或者說網路模組開始。在這個框架開發過程中,我會整理開發思路、以及遇到一些設計問題時會有怎麼樣的考慮、解決方案,當然這只是我個人的觀點,大家也可以有自己的實現。除了網路框架,後續的系列還想更新ImageLoader框架、ORM框架,如果有時間也會增加動畫框架和微博開發的系列文章。當然這些框架只是一些簡單的框架基礎,本人水平、時間有限,而且已經有現成、成熟的很多框架,我們在這裡只是以重複造輪子的態度去學習輪子構建過程,從而達到能夠造輪子的地步。至於很多細節的問題,我們這裡就不過多討論了,如果有興趣,各位可以自行研究。
最後,我們暫且把這個框架命名為SimpleNet,下面我們一起進入主題吧。
基本結構
SimpleNet框架的基本結構類似於Volley,包括一些命名上也有跟Volley一致。它主要分為四個部分,最上面的部分為Request,即各種請求型別。例如返回的資料型別為json的對應為JsonRequest,返回資料字串的為StringRequest,如果需要上傳檔案,那麼你需要使用MultipartRequest,該請求只支援小檔案的上傳,如果上傳的檔案過大則會產生OOM。
第二部分為訊息佇列,訊息佇列維護了提交給網路框架的請求列表,並且根據相應的規則進行排序。預設情況下更具優先順序和進入佇列的順序來執行,該佇列使用的是執行緒安全的PriorityBlockingQueue,因為我們的佇列會被併發的訪問,因此需要保證訪問的原子性。
第三部分是Executor,也就是網路的執行者。該Executor繼承自Thread,在run方法中迴圈訪問第二部分的請求佇列,請求完成之後將結果投遞給UI執行緒。為了更好的控制請求佇列,例如請求排序、取消等操作,這裡我們並沒有使用執行緒池來操作,而是自行管理佇列和Thread的形式,這樣整個結構也變得更為靈活。
第四部分則是Response投遞類,在第三部分的Executor中執行網路請求,Executor是Thread,但是我們並不能在主執行緒中更新UI,因此我們使用ResponseDelivery來封裝Response的投遞,保證Response執行在UI執行緒。每個部分職責都相對單一,這樣便於日後的升級和維護。
框架分析
圖1中看起來有點像是分層架構,其實不是,這個圖更多的是表達了它的邏輯順序,而不是結構。而在我們的應用開發中,分層架構是一個重要的手段,如圖2所示。
但在開發過程中,我們往往會把UI和業務層耦合起來,因為它們的關係太密切了,分解起來並不是那麼容易。高手能夠把複雜的事情簡單化,而分解就是簡單化的重要手段,分解這個過程在開發過程中我們成為重構。
那麼我們就引入了一個分層概念,為了便於理解你也可以按照如圖1的結構來加深理解。那麼分層有什麼優缺點呢?
優點:
- 複雜問題分解簡單化,每一層負責自己的實現,並向外提供服務;
- 職責分離,複雜的系統都有很多人員進行開發,這些功能開發的管理和整合是個很嚴重的問題,分層設計實現之後,每層只需定義好自己的對外介面,其他依賴層服務的就可以進行開發;
- 每一層對其他層都是獨立的,對外隱藏實現細節,上層無需知道下層的細節,只需呼叫介面即可;
- 有利於標準化。
缺點:
- 分層之後對於領域業務的修改有可能需要修改很多層;
- 過多的層次影響效能。
如上所說,我們的SimpleNet並不是分層的,而是簡單的模組化,但是理論基礎都是類似的,依賴於抽象而不依賴於實現、單一職責……這裡引入分層的概念,這是便於理解,同時也是希望大家在開發過程中能夠儘量保證模組的內聚性、耦合性。
再看SimpleNet,Request是一個抽象的泛型類,泛型型別就是返回的Response型別,例如StringRequest就是繼承自Request。第二部分的RequestQueue依賴於Request,Request是抽象的,因此任何Request的子類都可以傳遞到請求佇列中來,它依賴的是抽象Request,而不是具體的某個實現,因此保證了可擴充套件性。你可以自己實現自己所需的Request,例如大檔案的上傳Request。同理,第三部分的NetworkExecutor也只是依賴於Request抽象,但這裡又引入了一個型別HttpStack,這個網路請求的真正執行者,有HttpClientStack和HttpUrlConnStack,兩者分別為Apache的HttpClient和java的HttpURLConnection,關於這兩者的區別請參考:Android訪問網路,使用HttpURLConnection還是HttpClient?
HttpStack也是一個抽象,具體使用HttpClient還是HttpURLConnection則由執行系統版本來定,HttpStackFactory會根據系統版本給框架返回對應的HttpStack。最後的ResponseDelivery比較簡單了,只是通過Handler將結果投遞給UI執行緒執行,也就是執行RequestListener的onComplete方法,此時網路執行完成,使用者即可在該方法中更新UI或者相關的其他的操作。
下面我們再看看SimpleNet的工程結構,如圖3所示。
這就是SimpleNet框架的基本結構了,如果期待下一篇部落格的更新。
相關文章
- Android技能樹 — 網路小結(1)之網路體系結構Android
- 手把手教你寫網路爬蟲(2):迷你爬蟲架構爬蟲架構
- Android基礎之Java集合框架CollectionAndroidJava框架
- 手把手教你寫網路爬蟲(3):開源爬蟲框架對比爬蟲框架
- Android網路請求(4) 網路請求框架VolleyAndroid框架
- Android網路請求(終) 網路請求框架RetrofitAndroid框架
- Android網路請求(3) 網路請求框架OkHttpAndroid框架HTTP
- Android 網路框架 Retrofit 原始碼解析Android框架原始碼
- StarRocks基本架構原理架構
- Android面試之網路Android面試
- RxJava練武場之——基於Observable網路框架的搭建RxJava框架
- [原始碼解析] 訊息佇列 Kombu 之 基本架構原始碼佇列架構
- MySQL各版本架構圖MySql架構
- Webpack基本架構淺析Web架構
- 1.OpenDaylight基本架構架構
- nacos基本架構和安裝架構
- 微夢森網路-基於3.1.2框架框架
- 手把手教你寫網路爬蟲(4):Scrapy入門爬蟲
- 手把手教你寫網路爬蟲(5):PhantomJS實戰爬蟲JS
- 手把手教你寫網路爬蟲(7):URL去重爬蟲
- 手把手教你寫一個SpringMVC框架SpringMVC框架
- Linux基礎之網路管理Linux
- Android中基於HTTP的網路技術AndroidHTTP
- ABP框架之——資料訪問基礎架構框架架構
- 直播網站原始碼,寫一個android底部導航欄框架網站原始碼Android框架
- 超融合基本架構簡單定義架構
- 教你從頭寫遊戲伺服器框架遊戲伺服器框架
- 網路元件 基於Retrofit2+RxJava2+GSON/Fastjson的網路框架元件RxJavaASTJSON框架
- Android之Mina框架學習Android框架
- Android框架之Volley與GlideAndroid框架IDE
- 手把手教你寫網路爬蟲(1):網易雲音樂歌單爬蟲
- Android架構之高可用行動網路連線Android架構
- Android 架構之高可用行動網路連線Android架構
- ABP框架之——資料訪問基礎架構(下)框架架構
- Android技能樹 — 網路小結(2)之TCP/UDPAndroidTCPUDP
- Android技能樹 — 網路小結(3)之HTTP/HTTPSAndroidHTTP
- 教你寫個簡單的 Redis Client 框架 - .NET CoreRedisclient框架
- ios-APP重構之路(一) 網路請求框架iOSAPP框架
- 自己動手寫Android資料庫框架Android資料庫框架