Evolving,取為進化之意,仍然是一個新生兒,願景是提供儘可能多的通用網路業務處理,同時留給開發人員更多的可定製型,減少捆綁,使得開發人員能夠將更多的精力放在具體業務邏輯,無需對網路請求處理耗費過多成本。
雖然目前只是願景,但至少要有個夢想,雖不一定實現,但誰又能保證,萬一實現了呢?
EvolvingNetLib使用方式很簡單,仿照目前最流行的RxJava的鏈式呼叫方式,結合目前流行的RxJava2、Retrofit2,以及OkHttp3,通過簡單的封裝,實現類鏈式呼叫,一定程度上簡化了應用網路操作的封裝工作。
功能
EvolvingNetLib支援的功能還是比較豐富的,支援以下功能:
(1).支援普通的Http請求,包含GET、POST、PUT、DELETE、HEAD、OPTIONS。
(2).支援請求資料的記憶體快取查詢、磁碟快取查詢、網路資料請求。
(3).支援資料響應的記憶體快取、磁碟快取。
(4).支援檔案上傳,以及進度回撥。
(5).支援檔案斷點下載,進度回撥。
(6).支援自定義檔案下載儲存邏輯,以應對某些與具體業務結合性較強的場景,如:gzip、chuncked等。
配置
和其他的開源庫一樣,要想使用EvolvingNetLib,需要進行如下配置:
1.首先需要在專案根build.gradle
中新增如下配置:
如高亮區域所示,需要新增maven { url `https://jitpack.io` }
和maven { url `https://maven.google.com` }
兩個配置。
2.在app
或module
的build.gradle
中進行如下配置:
上圖中依賴了兩個類庫,均屬於Evolving系列,其中com.github.CodingCodersCode.EvolvingNetLib:EvolvingNet:v1.0.0為網路類庫,而com.github.CodingCodersCode.EvolvingNetLib:EvolvingBase:v1.0.0為Base類庫,結合了RxLifeCycle實現了RxJava生命週期的管理,以避免記憶體洩漏問題,其中EvolvingBase還提供了一個簡單的懶載入Fragment實現。
3.需要相應的許可權,如下:
<!--網路許可權-->
<uses-permission android:name="android.permission.INTERNET" />
<!--在SD卡中建立與刪除檔案許可權 -->
<uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/>
<!--讀取資料的許可權 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--向SD卡寫入資料的許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />複製程式碼
說明:對於6.0+系統需要動態申請許可權的情況,EvolvingNetLib並未提供申請邏輯,完全交由開發者自己實現,如此,開發者可任意選定許可權申請框架,或實現自己的動態許可權申請邏輯程式碼,減少不必要的捆綁性,增強可定製性。
完成上述配置,即可使用EvolvingNetLib進行網路請求相關的操作了,為方便大家理解和使用,下面以例項程式碼說明。
初始化設定
如果想要真正發起網路請求,那麼第一件事,肯定是需要初始化類庫設定,這是任何一個類庫都需要的,EvolvingNetLib的初始化操作如下:
CCRxNetManager ccRxNetManager = new CCRxNetManager.Builder()
.baseUrl("http://your host/")
.callAdapterFactory(RxJava2CallAdapterFactory.create())
.converterFactory(GsonConverterFactory.create())
.commonHeaders(commonHeaderMap)//設定公共header資訊
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.enableLogInterceptor(true)//是否開啟日誌列印
.build();複製程式碼
可以看出,上述初始化的所有方法均與Retrofit的相同,而事實也是如此,所有的設定均會被設定到Retrofit。
普通請求
類庫初始化設定完成,那麼就可以進行真正的網路請求了,以GET請求為例,完整使用程式碼如下:
CCRxNetManager.<TestRespObj>get("/your api path")
.setHeaderMap(specifyHeaderMap)//設定請求所需額外header資訊
.setPathMap(pathMap)//用於restful api中的path替換,模擬Retrofit @Path
.setParamMap(paramMap)//引數資訊,以Map<String, String>形式傳遞
.setRetryCount(3)//網路失敗重試次數
.setRetryDelayTimeMillis(3000)//失敗重試延遲
.setCacheQueryMode(CCCacheMode.QueryMode.MODE_MEMORY_THEN_DISK_THEN_NET)//快取查詢策略
.setCacheSaveMode(CCCacheMode.SaveMode.MODE_SAVE_MEMORY_AND_DISK)//快取儲存策略
.setReqTag("test_login_req_tag")//請求標識
.setCacheKey("test_login_req_cache_key")//快取標識
.setCCNetCallback(new RxNetManagerCallback())//請求回撥
.setCCCacheSaveCallback(new RxNetCacheSaveCallback())//快取儲存回撥
.setCCCacheQueryCallback(new RxNetCacheQueryCallback())//快取查詢回撥
.setNetLifecycleComposer(this.<CCBaseResponse<TestRespObj>>bindUntilEvent(ActivityEvent.DESTROY))//RxJava生命週期管理,詳細參考RxLifeCycle
.setResponseBeanType(TestRespObj.class)//json所對應的java bean實體類
.executeAsync();//執行請求複製程式碼
TestRespObj:
請求的目標資料所對應的java bean實體類,作用同Gson轉換時fromJson(String json,Type typeOfT)的第二個引數。
setCCCacheSaveCallback():
資料快取儲存回撥。之所以類庫不提供儲存邏輯,是減少捆綁性,方便開發者自定義儲存機制,是使用GreenDao,或者Litpal,或者其他開源資料庫框架,甚至自定義資料庫操作,哪一種都可以,資料完全由開發者控制,避免不同開發者有不同需求,從而導致內建儲存策略多餘的產生。也避免了框架快取資料時,某些開發者會覺得資料存在洩漏的不安全性。
setCCCacheQueryCallback():
快取資料查詢回撥。這麼做的意義與setCCCacheSaveCallback相同,都是為了減少捆綁性,給開發者更多的可定製性。
其餘的方法,在上面都通過註釋進行了標註,相信各位都能看明白,我就不再做過多的贅述了。
上面程式碼所展示的是GET型別請求,如果你想發起其餘的(POST、PUT、DELETE、HEAD、OPTIONS)請求,只需要將CCRxNetManager.get(“/your api path”)中的get替換為post等對應的小寫形式即可,無需其他任何改動。
上傳
上面介紹了普通請求的發起方式,下面介紹下上傳請求的使用方式。話不多說,直接上程式碼。
CCRxNetManager.<String>upload("upload")
.setHeaderMap(specifyHeaderMap)
.setPathMap(pathMap)
.setTxtParamMap(txtParamMap)
.setFileParamMap(fileParamMap)
.setRetryCount(0)
.setCacheQueryMode(CCCacheMode.QueryMode.MODE_ONLY_NET)
.setCacheSaveMode(CCCacheMode.SaveMode.MODE_NO_CACHE)
.setReqTag("test_login_req_tag")
.setCacheKey("test_login_req_cache_key")
.setCCNetCallback(new RxNetUploadProgressCallback())
.setNetLifecycleComposer(this.<CCBaseResponse<String>>bindUntilEvent(ActivityEvent.DESTROY))
.setResponseBeanType(TestRespObj.class)
.executeAsync();複製程式碼
可以看出,和普通請求的使用方式基本沒有差別,唯一的差別就是,普通請求的業務邏輯引數是通過setParamMap傳遞,而upload請求的引數分為兩部分,分別通過setTxtParamMap和setFileParamMap進行傳遞,兩者傳遞的都是Map<String, String>
物件,從方法名可以看出,前者傳遞文字類資訊,後者傳遞檔案類路徑資訊。至此,上傳請求的發起就完成了,剩下的工作就是在setCCNetCallback所設定的回撥中監聽結果。
下載
關於下載的使用方式,仍然是直接上程式碼。
CCDownloadRequest downloadRequest = CCRxNetManager.<String>download("sw-search-sp/software/16d5a98d3e034/QQ_8.9.5.22062_setup.exe")
.setHeaderMap(specifyHeaderMap)
.setPathMap(pathMap)
.setFileSaveName("test_OkGo_apk_file_download.apk")
.setRetryCount(3)
.setCacheQueryMode(CCCacheMode.QueryMode.MODE_ONLY_NET)
.setCacheSaveMode(CCCacheMode.SaveMode.MODE_NO_CACHE)
.setReqTag("test_login_req_tag")
.setCacheKey("test_login_req_cache_key")
.setSupportRage(true)
.setDeleteExistFile(false)
.setCCNetCallback(new RxNetDownloadCalback())
.setNetLifecycleComposer(this.<CCBaseResponse<String>>bindUntilEvent(ActivityEvent.DESTROY))
.setResponseBeanType(TestRespObj.class);
downloadRequest.executeAsync();複製程式碼
相信不用再做過多介紹,從方法名稱中就可以看出方法所對應的功能。
需要說明的是,如果想要暫停和停止下載,可以通過downloadRequest.getNetCCCanceler().cancel();方法實現,如果想繼續下載操作,可以再次呼叫downloadRequest.executeAsync();
好了,上面就是目前版本的EvolvingNetLib的完整使用方式,相信已經涵蓋了大部分的網路請求操作。感興趣的可以到Github檢視和下載demo體驗。
目前demo並未涵蓋所有功能,稍後會逐一完善。
喜歡的給個star,以示對我的鼓勵,不喜歡的也請免開噴子的金口,如果您有好的意見、建議或者修改,請您在github提出或提交pull request,讓我有機會向大神學習,膜拜大神,謝謝!
Github地址:
github.com/CodingCoder…