教你寫Android網絡框架之基本架構

jopen 9年前發布 | 13K 次閱讀 Android Android開發 移動開發

前言

在開發過程中,網絡是我們很重要的一部分,因此我們就以網絡框架或者說網絡模塊開始。在這個框架開發過程中,我會整理開發思路、以及遇到一些設計 問題時會有怎么樣的考慮、解決方案,當然這只是我個人的觀點,大家也可以有自己的實現。除了網絡框架,后續的系列還想更新ImageLoader框架、 ORM框架,如果有時間也會增加動畫框架和微博開發的系列文章。當然這些框架只是一些簡單的框架基礎,本人水平、時間有限,而且已經有現成、成熟的很多框 架,我們在這里只是以重復造輪子的態度去學習輪子構建過程,從而達到能夠造輪子的地步。至于很多細節的問題,我們這里就不過多討論了,如果有興趣,各位可 以自行研究。

最后,我們暫且把這個框架命名為SimpleNet,下面我們一起進入主題吧。

基本結構

教你寫Android網絡框架之基本架構 圖1 ( 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所示。

教你寫Android網絡框架之基本架構 圖2

但在開發過程中,我們往往會把UI和業務層耦合起來,因為它們的關系太密切了,分解起來并不是那么容易。高手能夠把復雜的事情簡單化,而分解就是簡單化的重要手段,分解這個過程在開發過程中我們成為重構。

那么我們就引入了一個分層概念,為了便于理解你也可以按照如圖1的結構來加深理解。那么分層有什么優缺點呢?

優點:

  1. 復雜問題分解簡單化,每一層負責自己的實現,并向外提供服務;
  2. 職責分離,復雜的系統都有很多人員進行開發,這些功能開發的管理和集成是個很嚴重的問題,分層設計實現之后,每層只需定義好自己的對外接口,其他依賴層服務的就可以進行開發;
  3. 每一層對其他層都是獨立的,對外隱藏實現細節,上層無需知道下層的細節,只需調用接口即可;
  4. 有利于標準化。

缺點:

  1. 分層之后對于領域業務的修改有可能需要修改很多層;
  2. 過多的層次影響性能。

如上所說,我們的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所示。

教你寫Android網絡框架之基本架構

圖3

這就是SimpleNet框架的基本結構了,如果期待下一篇博客的更新.

SimpleNet網絡框架github地址

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