2013-04-18 11 views
8

Buduję aplikację, która składa się z menu i widoku internetowego. Gdy użytkownik wybiera pozycje menu, widok internetowy powinien załadować respektujący plik HTML. Jak na razie dobrze.Jak włączyć buforowanie nagłówka wygasającego dla widoku WWW

Teraz widzę, że przeglądarka żąda html za każdym razem, gdy naciskam pozycję menu. Chciałbym załadować html tylko raz w sesji, ponieważ pliki HTML nie będą się zmieniać w ciągu dnia. Pierwszą rzeczą, którą zrobiłem, było prawidłowe ustawienie nagłówka wygasania po stronie serwera. Można to sprawdzić tutaj:

http://redbot.org/?uri=http%3A%2F%2Fcutoutcam.com%2Ftest1.php

Potem próbowałem

mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 

i

mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY); 

wyniki:

pierwsza wersja kupna html za każdym razem (sprawdzone z proxy) -> to dziwne. powinna pokazywać wersję z pamięci podręcznej, o ile nie wygasła. jaki jest problem?

druga wersja nie wnosi nowy plik HTML (to jest ok, bo to ma do tego)

Ktoś ma pomysł dlaczego wygasa nagłówka nie działa tu poprawnie?

Cały kod:

mWebView = (WebView) getView().findViewById(R.id.fragment_web_view_wv); 
mWebView.setWebViewClient(new WebViewClient(this)); 
mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); 



mWebView.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota, 
       android.webkit.WebStorage.QuotaUpdater quotaUpdater) 
     { 
      quotaUpdater.updateQuota(spaceNeeded * 2); 
     } 
}); 

mWebView.getSettings().setDomStorageEnabled(true); 


mWebView.getSettings().setAppCacheMaxSize(1024*1024*8); 


String appCachePath = getActivity().getApplicationContext().getCacheDir().getAbsolutePath(); 
mWebView.getSettings().setAppCachePath(appCachePath); 
mWebView.getSettings().setAllowFileAccess(true); 
mWebView.getSettings().setAppCacheEnabled(true); 
mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY); 
mWebView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR); 
mWebView.loadUrl(args.getString("url")); 

Odpowiedz

0

Zastosowanie WebSettings.LOAD_CACHE_ELSE_NETWORK myślę, że to jest to, czego potrzeba.

+1

Nie, nie jest: WebSettings.LOAD_CACHE_ELSE_NETWORK: "Użyj zasobów z pamięci podręcznej, gdy są dostępne, nawet jeśli wygasły." Chcę używać tych zasobów tylko wtedy, gdy ich ważność nie została wygaszona – stoefln

+0

której wersji Api używasz? – Vsevolod

+0

Buildtarget to poziom interfejsu API 17, minSdk to 8 – stoefln

2

Większość nowoczesnych przeglądarek zawsze wysyła do serwera żądanie, nawet w przypadku treści w pamięci podręcznej, aby sprawdzić, czy serwer ma zaktualizowaną zawartość. W takich przypadkach przeglądarka będzie zawierać nagłówek "If-Modified-Since" w żądaniu, aby serwer mógł szybko przywrócić pustą odpowiedź HTTP 304, jeśli nic się nie zmieni.

Dostępne opcje to 1) Skonfiguruj swój serwer, aby ocenić ostatnio zmodyfikowaną wersję i zwróć odpowiednio 304. Dzięki temu przeglądarka będzie korzystać z treści zapisanych w pamięci podręcznej. 2) Wdrożyć ładowanie strony za pomocą javascript i utworzyć niestandardowy mechanizm buforowania z localstorage, który nie podlega kaprysom dostawców przeglądarki. To trochę pracy, ale udało mi się to z powodzeniem w kilku projektach wrażliwych na wydajność.

+0

ok, więc nagłówek wygasania służy tylko informowaniu przeglądarki, że "lepiej buforować tę zawartość, może być konieczne ponowne jej wyświetlenie"? Hmm. Może masz rację... – stoefln

Powiązane problemy