1. 程式人生 > >基於RxJava2+Retrofit2的簡單易用網路請求框架

基於RxJava2+Retrofit2的簡單易用網路請求框架

640?wx_fmt=png&wxfrom=5&wx_lazy=1

今日科技快訊

昨日,HTC宣佈與Google簽署協議。原參與打造Google Pixel手機的HTC成員加入Google。此外,HTC還將其專利非專屬權授予Google使用。為了得到HTC的這些專利和將近2000名員工,Google一共拿出了11億美元的真金白銀。

作者簡介

明天就是週末啦,提前祝大家週末愉快!

本篇來自 周遊 的投稿,分享了自己封裝的網路框架,希望對大家有所幫助!

周遊 的部落格地址:

http://blog.csdn.net/zhouy478319399/

RxEasyHttp

本庫是一款基於 RxJava2+Retrofit2 實現簡單易用的網路請求框架,結合Android平臺特性的網路封裝庫,採用api鏈式呼叫一點到底,整合 cookie 管理,多種快取模式,極簡https配置,上傳下載進度顯示,請求錯誤自動重試,請求攜帶token、時間戳、簽名sign動態配置,自動登入成功後請求重發功能,3種層次的引數設定預設全域性區域性,預設標準ApiResult同時可以支援自定義的資料結構,已經能滿足現在的大部分網路請求。

注:Retrofit 和 Rxjava 是當下非常火爆的開源框架,均來自神一般的Square公司。本庫就不介紹 Retrofit 和 Rxjava2 的用法。

為什麼封裝此庫?

網上好的開源網路庫像 Volley、async-http、okhttp、retrofit 等都非常強大,但是實際應用中我們不會直接去使用,一般都會根據自己的業務再封裝一層,這樣更方便快捷,又能統一處理業務共性的東西例如:統一的資料結構(code、msg、data)、token處理、網路異常等情況。在使用 retrofit 來請求網路的時候,專案的需求越來越多,api也隨之越來越多,一個普通的應用api一般也在100+左右。如果把這些api放在一個ApiService內會很臃腫,不利於檢視api.如果採用模組的方式對api進行分類,每個模組對應若干個api.以retrofit的使用方式又需要建立若干個ApiService,這種方式維護方便,但是模組增多了,類也增多了很多。對於懶人來說就想通過一個URL就能回撥你所需要的資料,什麼 ApiService 都不想理會,同時又可以很快的與自己的業務相關聯,就類似於代替你在開源網路庫基礎上再封裝一層的作用,於是本庫就應運而生。

特點
  • 比Retrofit使用更簡單、更易用。

  • 採用鏈式呼叫一點到底

  • 加入基礎ApiService,減少Api冗餘

  • 支援動態配置和自定義底層框架Okhttpclient、Retrofit.

  • 支援多種方式訪問網路GET、POST、PUT、DELETE等請求協議

  • 支援網路快取,六種快取策略可選,涵蓋大多數業務場景

  • 支援固定新增header和動態新增header

  • 支援新增全域性引數和動態新增區域性引數

  • 支援檔案下載、多檔案上傳和表單提交資料

  • 支援檔案請求、上傳、下載的進度回撥、錯誤回撥,也可以自定義回撥

  • 支援預設、全域性、區域性三個層次的配置功能

  • 支援任意資料結構的自動解析

  • 支援新增動態引數例如timeStamp時間戳、token、簽名sign

  • 支援自定義的擴充套件API

  • 支援多個請求合併

  • 支援Cookie管理

  • 支援非同步、同步請求

  • 支援Https、自簽名網站Https的訪問、雙向驗證

  • 支援失敗重試機制,可以指定重試次數、重試間隔時間

  • 支援根據ky刪除網路快取和清空網路快取

  • 提供預設的標準ApiResult解析和回撥,並且可自定義ApiResult

  • 支援取消資料請求,取消訂閱,帶有對話方塊的請求不需要手動取消請求,對話方塊消失會自動取消請求

  • 支援請求資料結果採用回撥和訂閱兩種方式

  • api設計上結合http協議和android平臺特點來實現,loading對話方塊,實時進度條顯示

  • 返回結果和異常統一處理

  • 結合RxJava2,執行緒智慧控制

演示

0?wx_fmt=gif

0?wx_fmt=gif

0?wx_fmt=gif

快取介紹

本庫的快取主要分 okhttp 的 Cache快取 和 自定義的RxCache快取,大家有疑問 okhttp 有快取,retrofit 也是支援通過header來設定快取,為什麼還要自定義一個快取機制呢?通過自定義 RxCache 快取使用更簡單,更符合我們常用的業務需求(常用的快取策略也不會太複雜), retrofit 的快取藉助於 okhttp 通過攔截器 interceptor 實現 或者 通過@Headers("Cache-Control: public, max-age=3600) 具體用法這裡不做詳細描述,有興趣的可以自己去了解。動態修改快取時間不方便,例如:同一個介面,不同時間段請求的內容快取的時間不一樣,需要動態修改。

對於 DEFAULT模式 是 okhttp 的 Cache快取。因為該模式是完全遵循標準的http協議的,快取時間是依靠服務端響應頭來控制,也可以通過攔截器自己處理

對於 RxCache 的快取支援多種儲存方式,提供 IDiskConverter 轉換器介面目前支援 SerializableDiskConverter 和 GsonDiskConverter 兩種方式,也可以自定義 Parcelable、fastjson、xml、kryo 等轉換器 SerializableDiskConverter 使用快取前,必須讓快取的資料所有 javaBean 物件實現 Serializable 介面,否則會報 NotSerializableException。 因為快取的原理是將物件序列化後儲存,如果不實現 Serializable 介面,會導致物件無法序列化,進而無法儲存,也就達不到快取的效果。 優點:儲存和讀取都不用再轉化直接就是需要的物件速度快 缺點:如果 javabean 裡面還有 javabean 且層級比較多,也必須每個都要實現 Serializable介面,比較麻煩。

GsonDiskConverter 此種方式就是以 json 字串的方式儲存 優點:相對於SerializableDiskConverter 轉換器,儲存的物件不需要進行序列化 缺點:就是儲存和讀取都要使用Gson進行轉換,object->String->Object的給一個過程,相對來說每次都要轉換效能略低,但是效能基本忽略不計

目前提供了八種 CacheMode 快取模式,每種快取模式都可以指定對應的CacheTime,將複雜常用的業務場景封裝在裡面,讓你不用關心快取的具體實現,而專注於資料的處理

  • NO_CACHE:不使用快取,該模式下,cacheKey,cacheTime 等引數均無效

  • DEFAULT:按照HTTP協議的預設快取規則,走OKhttp的Cache快取

  • FIRSTREMOTE:先請求網路,請求網路失敗後再載入快取

  • FIRSTCACHE:先載入快取,快取沒有再去請求網路

  • ONLYREMOTE:僅載入網路,但資料依然會被快取

  • ONLYCACHE:只讀取快取,快取沒有會返回null

  • CACHEANDREMOTE: 先使用快取,不管是否存在,仍然請求網路,CallBack會回撥兩次.

  • CACHEANDREMOTEDISTINCT: 先使用快取,不管是否存在,仍然請求網路,CallBack回撥不一定是兩次,如果發現請求的網路資料和快取資料是一樣的,就不會再返回網路的回撥,既回撥一次。否則不相同仍然會回撥兩次。(目的是為了防止資料沒有發生變化,也需要回調兩次導致介面無用的重複重新整理),此種模式快取的物件bean一定要重寫tostring()方法

注:無論對於哪種快取模式,都可以指定一個 cacheKey,建議針對不同需要快取的頁面設定不同的 cacheKey,如果相同,會導致資料覆蓋。

RxCache

RxCache 是自己封裝的一個本地快取功能庫,採用 Rxjava+DiskLruCache 來實現,執行緒安全內部採用 ReadWriteLock 機制防止頻繁讀寫快取造成的異常,可以獨立使用,單獨用 RxCache 來儲存資料。採用 transformer 與網路請求結合,可以實現網路快取功能,本地硬快取,具有快取讀寫功能(非同步)、快取是否存在、根據key刪除快取、清空快取(非同步)、快取Key會自動進行MD5加密、可以設定快取磁碟大小、快取key、快取時間、快取儲存的轉換器、快取目錄、快取Version等功能本庫不作為重點介紹。後期會將此程式碼獨立開源一個庫,作為一分鐘讓你自己的網路庫也具有快取功能,敬請期待!!!

最後

由於此庫的用法以及配置多種多樣,本篇文章就不再贅述,感興趣的朋友可以點選最後 閱讀原文 檢視更加完整的詳細用法。

GitHub 地址:

https://github.com/zhou-you/RxEasyHttp

更多

每天學習累了,看些搞笑的段子放鬆一下吧。關注最具娛樂精神的公眾號,每天都有好心情。

640?wx_fmt=gif

如果你有好的技術文章想和大家分享,歡迎向我的公眾號投稿,投稿具體細節請在公眾號主頁點選“投稿”選單檢視。

歡迎長按下圖 -> 識別圖中二維碼或者掃一掃關注我的公眾號:

640?wx_fmt=jpeg