web-dev-qa-db-fra.com

WebView charge le site Web en ligne, charge le fichier local en mode hors connexion

Je suis un débutant en programmation Java, mais j’ai suivi ici plusieurs solutions à mon problème, mais je n’en ai trouvé aucune qui convient à mon cas et je ne semble pas pouvoir obtenir le code correctement.

J'aimerais disposer d'une WebView qui ouvre une page en ligne (par exemple Google) lorsque le téléphone est en ligne et ouvre une page HTML locale lorsque le téléphone est hors ligne.

En même temps, je souhaite que le téléphone écrase la page locale lorsqu’il est en ligne, de sorte que la page locale hors connexion est toujours mise à jour à la dernière connexion du téléphone à Internet.

Des idées sur la manière dont cela pourrait être fait? Quelques simples indications de la bonne direction pourraient aider.

Merci beaucoup.

64
mstation

Cela ressemble à un simple mécanisme de mise en cache de la visualisation Web.

Ce qui suit devrait faire ce que vous recherchez:

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

La méthode isNetworkAvailable() recherche une connexion réseau active:

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

Enfin, n'oubliez pas d'ajouter les trois autorisations suivantes à votre 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"/>
113
jenzz

il arrive qu'une WebView ne puisse pas être mise en cache de manière native. Si l'en-tête de page contient les champs suivants, WebView ne pourra pas mettre en cache le contenu de cette page. Cache-Control: no-store, no-cache Pragma: no-cache

Dans ce cas, vous devrez modifier la propriété de page sur le serveur pour résoudre le problème de mise en cache.

17
Jeppe Leth

Je sais que c'est un vieux post, mais cela correspond à ce que j'essaie de faire.

J'ai une vue Web qui contrôle certains éléments de la domotique. Pour le moment, la page s'actualise toutes les 5 minutes à l'aide d'une méta-actualisation.

Le problème est que lorsqu'il n'y a pas de signal mobile, vous obtenez simplement une page d'erreur. L'application doit donc être fermée et rouverte.

Cela ressemble à cela pourrait fonctionner en dehors d'une chose. Si j'utilise une version en cache de la page et que j'appuie sur le bouton pour augmenter la température de chauffage lorsque le téléphone est hors ligne, que va-t-il se passer? Va-t-il conserver l'action jusqu'à ce qu'il soit en ligne, puis l'envoyer? Ou alors tout serait-il désynchronisé?

Si ce dernier, y a-t-il un moyen de surmonter cela?

0
AndyJ