EvolvingNetLib,嗯,一个网络请求库而已

·  阅读 507

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…

收藏成功!
已添加到「」, 点击更改