2014-05-21 14 views
7

Używam Retrofit z klientem OKHttp do buforowania odpowiedzi z interfejsu API JSON.Jak unieważnić/wymusić aktualizację trasy pamięci podręcznej na następne żądanie za pomocą Retrofitu i OKHttp?

To działa ładnie.

Jeśli jednak podejmiemy działanie na urządzeniu, które powoduje aktualizację danych na serwerze, potrzebuję sposobu "unieważnienia" konkretnej trasy, aby zapewnić, że następnym razem, gdy zostanie wysłane żądanie dla tych danych, jest pobierany ponownie z serwera, a nie z obecnie przestarzałej wersji z pamięci podręcznej.

Obecnie pracowałem nad tym poprzez jawne wywoływanie nowej trasy z flagą "no-cache" w nagłówku Cache-Control żądania, ale to zmusza mnie do pobrania nowych danych, zanim będzie to potrzebne, potencjalnie wiele razy, jeśli podejmowanych jest wiele akcji, aby utrzymać aktualność pamięci podręcznej.

Czy istnieje sposób, w jaki mogę oznaczyć trasę/metodę w moim kliencie retrofit/OKhttp po wygaśnięciu pamięci podręcznej, wymagając aktualizacji obowiązkowej w sieci przy następnym żądaniu?

Odpowiedz

4

Nie ma w tym interfejsu API, ale powinien istnieć. Proszę open kwestię OkHttp, aby to zgłosić.

Założenie implementacji zajmie nam trochę czasu, ponieważ musimy się dowiedzieć, jaki jest najlepszy interfejs API. Unieważnienie pojedynczego adresu URL jest proste. Unieważnienie zakresu adresów URL (na przykład square.com/cash/*) jest trudniejsze, ponieważ pamięć podręczna OkHttp jest obecnie uporządkowana według sum kontrolnych adresów URL. Są też nieprzyjemne przypadki, takie jak to, co dzieje się, gdy w pamięci podręcznej zapisywany jest nieprawidłowy adres URL.

+1

Dziękujemy za szybką odpowiedź. Stworzyłem problem zgodnie z wymaganiami: https://github.com/square/okhttp/issues/853 – Shaun

7

Jest to teraz możliwe w OkHttp przy użyciu funkcji Cache.urls(). Jak the documentation mówi:

Iterator obsługuje Iterator.remove(). Usunięcie adresu URL z iteratora powoduje usunięcie odpowiadającej odpowiedzi z pamięci podręcznej. Użyj tej opcji, aby usunąć wybrane odpowiedzi z adresu .

To merged into master koniec grudnia 2014 i wydaje się być częścią tych tagów (komunikatów): rodzic-2.4.0-RC1 rodzic-2.4.0 rodzic-rodzic-2.3.0 2.2.0

8

z retrofit2 i OkHttp3 można wymusić nową odpowiedź dodając nagłówek Cache-Control do parametrów definicja metody API:

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

i wtedy, gdy dzwoni albo dostarczyć null dla (maybe-) buforowane lub wersja "no-cache" f lub wersja na żywo:

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

Świetne rozwiązanie! – AndroidRuntimeException

Powiązane problemy