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…