RetrofitCache 讓 retrofit2+okhttp3+rxjav 配置快取如此簡單。
阿新 • • 發佈:2018-11-26
RetrofitCache
簡介:RetrofitCache 讓 retrofit2+okhttp3+rxjav 配置快取如此簡單。通過註解配置,可以針對每一個介面靈活配置快取策略;同時讓每一個介面方便支援資料模擬,可以程式碼減小侵入性,模擬資料可以從記憶體,Assets,url 輕鬆獲取。
標籤:
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.0.9' //retrofit2+okhttp3+rxjava1 compile 'ren.yale.android:retrofitcachelibrx2:1.0.9' //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 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,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,okhttp3,rxjava2 等其它混淆配置請自行新增