2013-04-18 9 views
8

Ich baue eine App, die aus einem Menü und einem Webview besteht. Wenn der Benutzer Menüelemente auswählt, sollte die Webansicht die entsprechende HTML-Datei laden. So weit, ist es gut.So aktivieren Sie die Verfalls-Header-Zwischenspeicherung für die Webansicht

Jetzt erfahre ich, dass die Webansicht den HTML-Code jedes Mal anfordert, wenn ich den Menüeintrag drücke. Ich möchte nur den HTML-Code einmal in einer Sitzung laden, weil die HTML-Dateien nicht während eines Tages geändert werden. Als erstes habe ich den expires-Header auf der Serverseite korrekt gesetzt. Sie können es hier:

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

Dann habe ich versucht

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

und

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

Ergebnisse:

erste Version fordert die html jedes Mal (mit einem überprüft Proxy) -> das ist komisch. Es sollte die zwischengespeicherte Version anzeigen, solange sie nicht abgelaufen ist. was ist das Problem?

zweite Version fordert nie eine neue HTML-Datei (das ist ok, weil es dazu angenommen hat)

Wer hat eine Idee, warum der Header abläuft hier nicht richtig funktioniert?

Der gesamte Code:

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")); 

Antwort

0

Verwenden WebSettings.LOAD_CACHE_ELSE_NETWORK Ich denke, das ist das, was man braucht.

+1

nein es ist nicht: WebSettings.LOAD_CACHE_ELSE_NETWORK: "Verwenden Sie zwischengespeicherte Ressourcen, wenn sie verfügbar sind, auch wenn sie abgelaufen sind." Ich möchte nur die Ressourcen verwenden, wenn sie nicht abgelaufen sind – stoefln

+0

welche Version von Api verwenden Sie? – Vsevolod

+0

Buildtarget ist API-Ebene 17, minSdk ist 8 – stoefln

2

Die meisten modernen Browser werden immer eine Anfrage an den Server stellen, sogar für zwischengespeicherten Inhalt, nur um zu überprüfen, ob der Server den Inhalt aktualisiert hat. In diesen Fällen enthält der Browser einen Header "If-Modified-Since" in der Anforderung, sodass der Server schnell eine leere HTTP 304-Antwort zurückgeben kann, wenn sich nichts geändert hat.

Sie haben die folgenden Optionen: 1) Konfigurieren Sie Ihren Server für die Auswertung von Last-Modified-Since und geben Sie 304 entsprechend zurück. Dadurch wird der Browser angewiesen, den zwischengespeicherten Inhalt zu verwenden. 2) Implementieren Sie Ihre Seite Laden mit Javascript und erstellen Sie einen benutzerdefinierten Caching-Mechanismus mit Localspeicher, die nicht den Launen der Browser-Anbieter unterliegt. Das ist ein bisschen Arbeit, aber was ich bei mehreren leistungsempfindlichen Projekten erfolgreich gemacht habe.

+0

ok, also ist die abgelaufene Kopfzeile nur für den Browser sagen "besser Cache diesen Inhalt, müssen Sie es möglicherweise erneut anzeigen"? Hmm. Vielleicht hast du recht... – stoefln

Verwandte Themen