1. 程式人生 > >RetrofitCache 讓 retrofit2+okhttp3+rxjav 配置快取如此簡單。

RetrofitCache 讓 retrofit2+okhttp3+rxjav 配置快取如此簡單。

RetrofitCache

專案地址:yale8848/RetrofitCache 

簡介:RetrofitCache 讓 retrofit2+okhttp3+rxjav 配置快取如此簡單。通過註解配置,可以針對每一個介面靈活配置快取策略;同時讓每一個介面方便支援資料模擬,可以程式碼減小侵入性,模擬資料可以從記憶體,Assets,url 輕鬆獲取。

更多:作者   提 Bug   

標籤:

 

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.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 等其它混淆配置請自行新增

歡迎提問討論

討論區

貢獻程式碼

貢獻程式碼