Giter Site home page Giter Site logo

yale8848 / retrofitcache Goto Github PK

View Code? Open in Web Editor NEW
675.0 15.0 85.0 259 KB

RetrofitCache让retrofit2+okhttp3+rxjava配置缓存如此简单。通过注解配置,可以针对每一个接口灵活配置缓存策略;同时让每一个接口方便支持数据模拟,可以代码减小侵入性,模拟数据可以从内存,Assets,url轻松获取。

License: MIT License

Java 100.00%
retrofit okhttp rxjava cache android mock

retrofitcache's Introduction

RetrofitCache

English

RetrofitCache让retrofit2+okhttp3+rxjava 配置缓存如此简单。通过注解配置,可以针对每一个接口灵活配置缓存策略;同时让每一个接口方便支持数据模拟,可以代码减小侵入性,模拟数据可以从内存,Assets,url轻松获取。

为什么使用RetrofitCache

  • 服务端接口不严格按照http缓存策略配置,有些不会针对每一个请求单独配置缓存策略
  • 第三方缓存库不是很方便的针对每一个接口进行缓存策略配置,侵入性比较大
  • 很方便的针对每个接口添加模拟数据

调用例子

  • 不走缓存例子
@GET("users")
Observable<HttpResult> test();
  • 缓存设置为20秒
@Cache(time = 20)
@GET("users")
Observable<HttpResult> test();
  • 缓存设置为20分钟
@Cache(time = 20,timeUnit = TimeUnit.MINUTES)
@GET("users")
Observable<HttpResult> test();
  • 默认时间缓存,默认是0秒
@Cache()
@GET("users")
Observable<HttpResult> test();
  • 默认在无网的时候强制走缓存,forceCacheNoNet=false时无网络时不强制缓存
@Cache(forceCacheNoNet = false)
@GET("users")
Observable<HttpResult> test();
  • 添加模拟数据(value,assets,url同时都配置的话,就按照这个顺序处理)
@Mock(value = "{\"data\":\"mockdata\"}") //模拟内存数据
@GET("users")
Observable<HttpResult> test();
@Mock(assets = "mock/mock.json") //从assets获取模拟数据
@GET("users")
Observable<HttpResult> test();
@Mock(url = "http://url.com/test") //从新的url请求数据
@GET("users")
Observable<HttpResult> test();

缓存只对http Get请求有效;如果要问为什么,可以问问后台开发同学

使用方法:

  • 添加 jcenter lib,注意根据自己的库选择
compile 'ren.yale.android:retrofitcachelib:1.1.1'   //retrofit2+okhttp3+rxjava1
compile 'ren.yale.android:retrofitcachelibrx2:1.1.1'   //retrofit2+okhttp3+rxjava2
  • 在Android Application里初始化
RetrofitCache.getInstance().init(this);

也可以修改默认配置,默认time=0,timeUnit = TimeUnit.SECONDS

RetrofitCache.getInstance().init(this).setDefaultTimeUnit(TimeUnit.MINUTES).setDefaultTime(1);
  • OkHttpClient初始化时配置缓存目录
okhttp3.OkHttpClient.Builder clientBuilder=new okhttp3.OkHttpClient.Builder();
...
int cacheSize = 200 * 1024 * 1024;
File cacheDirectory = new File(mContext.getCacheDir(), "httpcache");
Cache cache = new Cache(cacheDirectory, cacheSize);
OkHttpClient client =  clientBuilder.cache(cache).build();
...

  • 给okhttp添加拦截器
okhttp3.OkHttpClient.Builder clientBuilder=new okhttp3.OkHttpClient.Builder();
...

//clientBuilder.addInterceptor(new MockInterceptor()); //如果只用Mock模拟功能,只需添加这个拦截器
clientBuilder.addInterceptor(new CacheForceInterceptorNoNet());
clientBuilder.addNetworkInterceptor(new CacheInterceptorOnNet());
...

添加CacheForceInterceptorNoNet作用是在无网时强制走缓存,如果只添加了CacheInterceptorOnNet,那么在有网和无网的缓存策略就会一样

  • 添加retrofit对象
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .client(getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
RetrofitCache.getInatance().addRetrofit(retrofit);
  • 添加 rx Observable compose
api.test().compose(CacheTransformer.emptyTransformer())...

进阶

  • setCacheInterceptorListener 设置是否每一个接口都缓存
RetrofitCache.getInstance().setCacheInterceptorListener(
                new CacheInterceptorListener() {
            @Override
            public boolean canCache(Request request,Response response) {
                String res = "";
                try {
                    res = response.body().string();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return true;
            }
});

  • 设置是否走模拟数据,比如说在正式接口好了后可以如下设置,让模拟数据失效
RetrofitCache.getInstance().enableMock(false);
  • 忽略某个参数;如果你对原url增加参数,可以设置忽略
 RetrofitCache.getInstance().addIgnoreParam("access_token");

混淆配置(retrofit2+okhttp3+rxjava1)

-dontwarn ren.yale.android.retrofitcachelib.**
-keep class ren.yale.android.retrofitcachelib.** { *; }
-keepclasseswithmembernames class rx.Observable { *; }
-keepclasseswithmembernames class rx.internal.operators.OnSubscribeLift { *; }
-keepclasseswithmembernames class retrofit2.adapter.rxjava.RxJavaCallAdapterFactory { *; }
-keepclasseswithmembernames class retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe { *; }
-keepclasseswithmembernames class retrofit2.Retrofit { *; }
-keepclasseswithmembernames class retrofit2.ServiceMethod { *; }
-keepclasseswithmembernames class retrofit2.OkHttpCall { *; }

###retrofit2 2.5.0
-keepclasseswithmembernames class retrofit2.HttpServiceMethod {*;}
-keepclasseswithmembernames class retrofit2.RequestFactory {*;}

#retrofit2,okhttp3,rxjava1等其它混淆配置请自行添加

混淆配置(retrofit2+okhttp3+rxjava2)

-dontwarn ren.yale.android.retrofitcachelibrx2.**
-keep class ren.yale.android.retrofitcachelibrx2.** { *; }
-keepclasseswithmembernames class  retrofit2.adapter.rxjava2.BodyObservable { *; }
-keepclasseswithmembernames class  retrofit2.adapter.rxjava2.ResultObservable { *; }
-keepclasseswithmembernames class  retrofit2.adapter.rxjava2.CallEnqueueObservable { *; }
-keepclasseswithmembernames class  retrofit2.adapter.rxjava2.CallExecuteObservable { *; }
-keepclasseswithmembernames class retrofit2.Retrofit { *; }
-keepclasseswithmembernames class retrofit2.ServiceMethod { *; }
-keepclasseswithmembernames class retrofit2.OkHttpCall { *; }

###retrofit2 2.5.0
-keepclasseswithmembernames class retrofit2.HttpServiceMethod {*;}
-keepclasseswithmembernames class retrofit2.RequestFactory {*;}

#retrofit2,okhttp3,rxjava2等其它混淆配置请自行添加

欢迎提问讨论

讨论区

贡献代码

贡献代码

开源协议

MIT License

Copyright (c) 2017 Yale

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

retrofitcache's People

Contributors

yale8848 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

retrofitcache's Issues

retrofit 2.6版本此库失效

retrofit 2.6版本此库失效, 经过测试这里使用了反射功能来进行一些判断 ,在retrofit 2.6版本可能有些API调整导致判断失效

为何我设置了也不走缓存呢,都是走的服务器?

Mobile:

Android OS: 8.0

NetWork: WIFI

URL:

LIB Version:


OkHttpClient httpClient = new OkHttpClient.Builder()
.cache(cache)
// .cookieJar(new CookieManger(mContext.getApplicationContext()))
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
.addInterceptor(MyInterceptor)
.addInterceptor(new CacheForceInterceptorNoNet())
.addNetworkInterceptor(new CacheInterceptorOnNet())
.build();

mRetrofit = new Retrofit.Builder()
.baseUrl(mApiServer)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
RetrofitCache.getInstance().init(mContext.getApplicationContext()).setDefaultTimeUnit(TimeUnit.SECONDS).setDefaultTime(30);
RetrofitCache.getInstance().addRetrofit(mRetrofit);
mApiService = mRetrofit.create(IApiService.class);

@Cache(time = 10,timeUnit = TimeUnit.MINUTES)
@get("v1/robot")
Observable<ResultVO> getRobotInfo();

这是我的设置,不管我怎么设置时间,都不走缓存是什么原因,哪儿写错了吗?

Mock 与CacheForceInterceptorNoNet

.addInterceptor(new CacheForceInterceptorNoNet())
如果不配置这一行,我注解的mock就不生效。

我主要是想用这个项目的注解式mock功能,不太需要缓存功能。

请求添加对协程的支持

协程用起来非常的爽,比起rxjava2轻量,且性能更好,读起来也没有rxjava的复杂
恳请作者追加对协程的支持

报错NoSuchMethodException

Mobile:

Android OS:

NetWork:

LIB Version:


报错了,是我使用的姿势不对吗。。

09-14 16:50:03.380 15736-15736/com.whfp.tongpao W/retrofitcache: java.lang.NoSuchMethodException: toRequest [class [Ljava.lang.Object;]
09-14 16:50:10.548 15736-15736/com.whfp.tongpao W/retrofitcache: java.lang.NoSuchMethodException: toRequest [class [Ljava.lang.Object;]
09-14 16:50:10.603 15736-15736/com.whfp.tongpao W/System.err: at ren.yale.android.retrofitcachelibrx2.intercept.CacheForceInterceptorNoNet.intercept(CacheForceInterceptorNoNet.java:45)
09-14 16:50:25.065 15736-15736/com.whfp.tongpao W/retrofitcache: java.lang.NoSuchMethodException: toRequest [class [Ljava.lang.Object;]

有网络先加载缓存,再加载网络

Mobile:

Android OS:

NetWork:

URL:

LIB Version:


如题,现在业务上是这种需求。其实缓存类似于Gilde中的占位符作用,当进来的时候先显示缓存不至于一片空白,再去加载网络数据。当然没有缓存就显示空白。不知道作者是否有处理这一块?

缓存只支持get请求吗,post不支持吗

我使用post请求,断网后,在缓存有效期内,不显示数据,是不支持post请求吗

https://github.com/z-chu/RxCache
这个缓存库可以满足这个需求(有网络先加载缓存,再加载网络 #25),缓存策略也较全,但是使用麻烦,如果楼主可以结合他的缓存策略,保持你的库使用方式不变的情况就完美了,

混淆 keep 规则过于暴力

你好,感谢分享和开源这个项目,它看起来很棒!

不过我看到在 README 文档中写到需要 keep 一系列 okhttp、retrofit 等相关代码,而且都是全量 keep **,过于暴力,实际上,这些 keep 很多都是不必要的,如果是 aar 项目,大多会有 consumerProguard,它们会自动采纳开源库作者内置的 Proguard rules,如果全量 keep 起来,会导致 minify 工具无法正常排除无用代码最终使得安装包体积增大。

# retrofit2
-dontwarn retrofit2.**
-keep class retrofit2.** { *; } # <- 不应该
-keepattributes Signature
-keepattributes Exceptions

-dontwarn org.robovm.**
-keep class org.robovm.** { *; } # <- 不应该

# okhttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;} # <- 不应该
-keep class okhttp3.** { *;} # <- 不应该
-keep class okio.** { *;} # <- 不应该
-dontwarn sun.security.**
-keep class sun.security.** { *;}
-dontwarn okio.**
-dontwarn okhttp3.**

# rxjava
-dontwarn rx.** 
-keep class rx.** { *; } # <- 不应该

如果可以,请修改这部分内容,以免产生误导 :) 再次表示感谢!

后台规定全用post

明明只是普通的获取数据可以用get,但是后台规定所有请求都用post.那就没法用了吗...

设置缓存时间在使用CacheForceInterceptorNoNet的时候无效?

缓存时间只对有网时候的请求生效?我设置60秒,断网情况下还是一直加载缓存,并不会到60秒的时候就加载不到数据。

可以做到我说的需求吗?设置一个时间,没网的时候还是先加载缓存,超过这个时间再加载不到任何数据了。

如何在下拉刷新的时候不走缓存.

Mobile:

Android OS:

NetWork:

URL:

LIB Version:


大神你好.我知道可以在一定时间内请求一个接口后再次请求走的是缓存.
我想在用户下拉刷新的时候.去请求接口而不是请求缓存.请求完的接口后存为最新的缓存
有相应的方法吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.