Retrofit2キャッシュ実装

なぜ使用のキャッシング

1.負荷高速化
2.データ使用量の削減
3.圧力を逃がしサーバは
一切4.ユーザーエクスペリエンスを最適化していないときも、ネットワークにアクセスすることができます

私のニーズについてのトーク:
1.キャッシュを使用すると、日付まで、時間のネット短い期間を持っている場合は、キャッシュもはやネットが存在しない
2.他のインタフェースは、キャッシュファイルはありません、インタフェースがキャッシュファイルを生成し、指定
3.ドロップダウン缶は、リフレッシュを強制リフレッシュ

原則

Retrofit2は、キャッシュが、天然okhttp遮断することによって達成される、特にキャッシュ・コントロールによって制御される実装
次のように別々に

      
      
1
2
3
4
5
6
7
8
9
10
11
12
      
      
NO- キャッシュはNO - キャッシュの時間はキャッシュされませんが、応答はクライアント(ブラウザ)にデータを提供するたびに、キャッシュは、キャッシュサーバへの応答の有効性を評価しなければなりません。
NO - 保管し 、すべてのコンテンツがキャッシュや一時インターネットファイルにキャッシュされることはありません
最大 -age = XXX(xxxは IS 数値 )、このオプションは、障害発生後XXX秒にキャッシュされたコンテンツだけで HTTP 1.1が あれば利用可能で、 最終 変性を一緒に使用する場合、優先順位の高いです
最大 -staleと 最大 -ageは、唯一頭要求の内側に配置することができます。
そして、設定最大 -staleと 最大 -age、最長の時間カウントすることにより、キャッシュミスを。(この事実は、もつれていません)
キャッシュのCacheControl.FORCE_CACHE必須使用データがキャッシュされていない場合は、その後、スロー504のみ - のIF -Cached)
CacheControl.FORCE_NETWORKは、どのキャッシュを使用せずに、ネットワークを使用することを余儀なくされました。

単純な実装

1.最初のインターセプターを作成します

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      
      
static Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
public Response (Chain chain) throws IOException {
Request request = chain.request();
Response response = chain. proceed(request);
if (NetworkUtil.isNetworkAvalible(MyApplication.getContext())) {
int maxAge = 60;
return response.newBuilder()
.removeHeader( "Pragma") //清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
.header( "Cache-Control", "public ,max-age=" + maxAge)
.build();
}
return response;
}
};

2.这样的话就写好了拦截器,然后就是把拦截器设置到okhttp里面

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      
      
File httpCacheDirectory = new File(MyApplication.getInstance().getExternalCacheDir(), "HttpCache");
大专栏  Retrofit2缓存实现 class="attribute"> int cacheSize = 10 * 1024 * 1024;
Cache cache = new Cache(httpCacheDirectory, cacheSize);
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
.cache(cache)
.build();
r e t r o f i t = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();

注意缓存路径要写对,同时注意addNetworkInterceptor和addInterceptor的区别
这样就简单实现了retrofit的缓存,在60秒内可以通过缓存来访问,优化访问速度与体验

不同接口可缓存不同时间,同时可设置是否缓存

从header中获取cache-Control字段,即可实现不同接口缓存不同时间,header中没有cache-control字段时则不缓存

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
      
      
@Headers( "Cache-Control: public, max-age=3600")
@GET( "song/getsonglistsong?id=recommend")
Flowable<SongList> getRecommendList();
static Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
public Response (Chain chain) throws IOException {
Request request = chain.request();
Response response = chain. proceed(request);
if (NetworkUtil.isNetworkAvalible(MyApplication.getContext())) {
String cacheControl =request.cacheControl().toString();
return response.newBuilder()
.removeHeader( "Pragma") //清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
.header( "Cache-Control", cacheControl)
.build();
}
戻り値の 応答;
}
}。

参考リンク

https://www.cnblogs.com/cxk1995/p/5996586.html
https://blog.csdn.net/adzcsx2/article/details/51365548
https://www.jianshu.com/p/241e6af94390
ます。https:/ /blog.csdn.net/wangkeke1860/article/details/52084869
https://www.jianshu.com/p/9c3b4ea108a7
https://www.cnblogs.com/android-yus/p/5280739.html
ます。https:// blog.csdn.net/u010286855/article/details/52608485

おすすめ

転載: www.cnblogs.com/sanxiandoupi/p/11711045.html