WebView lädt Website, wenn es online ist, lädt lokale Datei, wenn es offline ist

74

Ich bin eigentlich neu in der Programmierung in Java, aber ich habe hier verschiedene Lösungen für mein Problem verfolgt, aber keine gefunden, die zu meinem Fall passt, und ich kann den Code scheinbar nicht richtig verstehen.

Ich hätte gerne eine WebView, die eine Online-Seite (zum Beispiel Google) öffnet, wenn das Telefon online ist, und eine lokale HTML-Seite öffnet, wenn das Telefon offline ist.

Gleichzeitig möchte ich, dass das Telefon die lokale Seite überschreibt, wenn es online ist, sodass die lokale Offline-Seite immer auf das letzte Mal aktualisiert wird, als das Telefon mit dem Internet verbunden war.

Irgendwelche Ideen, wie das gemacht werden könnte? Ein einfacher Hinweis in die richtige Richtung könnte helfen.

Danke vielmals.

mstation
quelle

Antworten:

129

Das klingt für mich nach einem einfachen Webview-Caching-Mechanismus.

Folgendes sollte tun, wonach Sie suchen:

WebView webView = new WebView( context );
webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
webView.getSettings().setAppCachePath( getApplicationContext().getCacheDir().getAbsolutePath() );
webView.getSettings().setAllowFileAccess( true );
webView.getSettings().setAppCacheEnabled( true );
webView.getSettings().setJavaScriptEnabled( true );
webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT ); // load online by default

if ( !isNetworkAvailable() ) { // loading offline
    webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
}

webView.loadUrl( "http://www.google.com" );

Die Methode isNetworkAvailable()sucht nach einer aktiven Netzwerkverbindung:

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService( CONNECTIVITY_SERVICE );
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

Vergessen Sie nicht, die folgenden drei Berechtigungen zu Ihrer hinzuzufügen AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
jenzz
quelle
2
das ist wirklich komplett .. funktioniert wie ein Zauber! Vielen Dank, dass Sie mir den Cache-Modus gezeigt haben
mstation
@jenzz: Ich habe zwei Probleme mit deiner Lösung. In meinem Fall wird im Cache-Verzeichnis (externe SD-Karte) zunächst nur eine leere Datei mit dem Namen angezeigt ApplicationCache.db. Sollte nicht größer sein? Vielleicht wird der Cache woanders gespeichert? Zweitens ist die .setAppCacheMaxSize()Sache in API18 veraltet, nicht sicher, wie man mehr Chache dann hinzufügt ...
Luis A. Florit
In Zukunft wird das Kontingent automatisch verwaltet. Sie müssen nicht eingestellt werden.
Anshad
5
"Das klingt für mich nach einem einfachen Webview-Caching-Mechanismus." Schlägerleben 8)
AndBecaPine
2
Funktioniert bei mir nicht, wenn die App beendet und im Offline-Modus erneut geladen wird. Gute Arbeit noch +1
Skynet
22

In einigen Fällen kann ein WebView nicht nativ zwischengespeichert werden. Wenn der Seitenkopf die folgenden Felder enthält, kann WebView den Inhalt dieser Seite nicht zwischenspeichern. Cache-Kontrolle: kein Speicher, kein Cache Pragma: kein Cache

In diesem Fall müssen Sie die Seiteneigenschaft auf dem Server ändern, um das Caching-Problem zu lösen.

Jeppe Leth
quelle