MyRetrofitGo
一、史上最精简的【带有二级缓存】的【网络请求】封装,Kotlin语言实现,Retrofit2 结合OkHttp3网络层,ViewModel技术,使用Kotlin协程加载网络数据;并对网络层添加2级缓存功能——内存缓存和文件缓存;同时针对ApiService接口通过注解的形式来配置是否显示loadingDiaog、是否启用缓存功能;开发者可长按Activity后随时查看当前页面的所有网络请求LOG信息,减轻开发工作,且增加用户体验,堪称史上最简洁的代码,实现你想要的功能;
二、缓存逻辑:【开发者无需关心内部实现】
1 、无缓存: 调用接口->无内存缓存->无文件缓存-> 加载网络数据->网络数据更新UI->更新网络数据到内存和文件缓存
2 、有文件缓存:调用接口 -> 无内存缓存 ->有文件缓存 ->更新到内存缓存 -> 缓存数据更新UI-> 加载网络数据 -> 网络数据更新UI-> 更新网络数据到内存和文件缓存
3 、有内存缓存: 调用接口-> 有内存缓存-> 缓存数据更新UI-> 加载网络数据 -> 网络数据更新UI -> 更新网络数据到内存和文件缓存
三、接口声明:
* 如果接口返回数据类型为数组:则返回Datas
*/
interface InterfaceApi {
@MyRetrofitGo(tag = "获取提醒",loading = true, cache = true, hasCacheLoading = false)
@POST("home/remind")
fun getData(
@Query("username") username: String,
@Query("age") age: String,
): Data
@MyRetrofitGo(loading = false, cache = false)
@GET("home/getUser")
fun getDatas(
@Query("username") username: String,
@Query("age") age: String,
): Datas
}
">
interface InterfaceApi {
@MyRetrofitGo (tag = "获取提醒" ,loading = true, cache = true, hasCacheLoading = false)
@POST ("home/remind" )
fun getData(
@Query ("username" ) username : String,
@Query ("age" ) age : String,
): Data
@MyRetrofitGo (loading = false, cache = false)
@GET ("home/getUser" )
fun getDatas(
@Query ("username" ) username : String,
@Query ("age" ) age : String,
): Datas
}
四、ViewModel定义
class TestViewModel : BaseViewModel () {
fun test (name: String ) = go { API.getData(name, "23" ) }
fun tests (name: String ) = go { API.getDatas(name, "23" ) }
}
五、Activity中调用:
var vm = initVM(TestViewModel::class .java)
vm.test(this , "name1" ).obs(this ) {
it.c { "缓存数据${it.toJson()} " .log() }
it.y { "网络数据${it.toJson()} " .log() }
it.n { "异常数据${it.toJson()} " .log() }
}
vm.tests(this , "name2" ).obs(this ) {
it.c { "缓存数据${it.toJson()} " .log() }
it.y { "网络数据${it.toJson()} " .log() }
it.n { "异常数据${it.toJson()} " .log() }
}
六、数据回调方法说明:【 c:cache简写;y:yes简写;n:no简写;调用顺序可随意】
it.c { } : 缓存数据加载成功回调;如果不使用缓存,可delete 该行代码;如果数据分页,当page==1 时,才使用缓存数据;
it.y { } : 网络数据加载成功回调;如果不处理成功,可delete 该行代码;如果数据分页,当page==1 时,清空list里缓存数据,再添加网络数据到list;
it.n { } : 网络数据加载失败回调;如果不处理失败,可delete 该行代码;如果数据加载失败,且缓存数据存在,根据需要写失败逻辑;
以上代码只是以下代码的简写【省略了else ,只为让代码看起来更优雅,更性感,3 个If块只会同时执行一个】:
if (it.errno==0 &&it.cache){
}
if (it.errno==0 &&!it.cache){
}
if (it.errno!=0 &&!it.cache){
}
七、效果
八、随时查看http请求Log【Activity长按1秒,可查看当前Activity的所有网络请求log】
请资助我一个棒棒糖吧,在此感谢: