EvolvingNetLib,嗯,一個網路請求庫而已

CodingCodersCode發表於2018-11-12

Evolving,取為進化之意,仍然是一個新生兒,願景是提供儘可能多的通用網路業務處理,同時留給開發人員更多的可定製型,減少捆綁,使得開發人員能夠將更多的精力放在具體業務邏輯,無需對網路請求處理耗費過多成本。

Github傳送門

雖然目前只是願景,但至少要有個夢想,雖不一定實現,但誰又能保證,萬一實現了呢?

EvolvingNetLib使用方式很簡單,仿照目前最流行的RxJava的鏈式呼叫方式,結合目前流行的RxJava2Retrofit2,以及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.在appmodulebuild.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請求的引數分為兩部分,分別通過setTxtParamMapsetFileParamMap進行傳遞,兩者傳遞的都是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地址:
github.com/CodingCoder…

相關文章