2014-05-21 4 views
7

JSON API의 응답을 캐싱하기 위해 OKHttp 클라이언트와 함께 Retrofit을 사용하고 있습니다.Retrofit 및 OKHttp를 사용하여 다음 요청시 캐시 경로를 무효화/강제 업데이트하는 방법?

잘 작동합니다.

그러나 서버에서 데이터가 업데이트되도록 조치를 취하는 경우 다음에이 데이터에 대한 요청이 이루어 지도록 특정 경로를 '무효화'하는 방법이 필요합니다. 오래된 캐시 된 버전이 아닌 서버에서 다시 가져옵니다.

현재 Cache-Control 헤더에서 "no-cache"플래그를 사용하여 새 경로를 명시 적으로 호출하여이 문제를 해결했습니다. 그러나이 작업을 수행하면 필요하기 전에 새로운 데이터를 다운로드해야하므로, 여러 작업이 수행되면 잠재적으로 여러 번 캐시가 최신 상태로 유지됩니다.

내 retrofit/OKhttp 클라이언트에서 경로/메소드를 만료 된 캐시로 표시 할 수있는 방법이 있습니까? 다음 번 요청시 네트워크를 통해 필수 업데이트가 필요합니까?

답변

4

API가 없지만 하나의 API가 있어야합니다. 이 문제를 신고하려면 OkHttp 문제 open을 보내주십시오.

우리가 구현할 수있는 시간이 좀 걸릴 것입니다. 왜냐하면 가장 적합한 API가 무엇인지 파악해야하기 때문입니다. 하나의 URL을 무효화하는 것은 간단합니다. OkHttp의 캐시가 현재 URL 체크섬으로 구성되어 있기 때문에 URL의 범위를 무효화하는 것 (예 : square.com/cash/*)이 더 어렵습니다. 무효화 된 URL이 현재 캐시에 쓰여지는 경우 발생하는 것과 같은 추한 경우도 있습니다.

+1

신속한 답변을 보내 주셔서 감사합니다. 요청한대로 문제를 만들었습니다. https://github.com/square/okhttp/issues/853 – Shaun

7

이제는 OkHttp에서 Cache.urls() 기능을 사용하여 가능합니다. the documentation은 다음과 같습니다 :

반복기는 Iterator.remove()를 지원합니다. 반복기에서 URL을 제거하면 해당 응답이 캐시에서 제거됩니다. 이것을 사용하여 선택된 응답을 퇴거시킵니다.

이 2014 merged into master 12 월 말이었고, 이러한 태그의 일부 (릴리스) 것 같다 : 부모-2.4.0-RC1 부모 2.4.0 부모 2.3.0 부모 - 2.2.0

retrofit2와
8

및 OkHttp3 당신이 당신의 API 메소드 정의 매개 변수에 캐시-Control 헤더를 추가하여 새로운 응답을 강제 할 수 있습니다 : A (maybe-)에 대한 null를 제공 중 하나를 호출 할 때 캐시

@GET("ws/something") 
Something getSomething(@Header("Cache-Control") String cacheControl); 

및 다음 버전 또는 "no-cache" f 또는 라이브 버전 :

myApi.getSomething(forceRefresh ? "no-cache" : null); 
+1

훌륭한 솔루션! – AndroidRuntimeException