2013-02-03 17 views
58

Sono davvero nuovo alla programmazione in Java ma ho seguito diverse soluzioni al mio problema ma non ne ho trovato uno che si adatta al mio caso e non riesco a sembrare ottenere il codice correttamente.WebView carica sito web quando online, carica file locale quando offline

Mi piacerebbe avere un WebView che apre una pagina online (ad esempio Google) quando il telefono è online e apre una pagina HTML locale quando il telefono è offline.

Allo stesso tempo, tuttavia, desidero che il telefono sovrascriva la pagina locale quando è online, in modo che la pagina locale offline sia sempre aggiornata fino all'ultima connessione del telefono a Internet.

Qualche idea su come questo potrebbe essere fatto? Alcuni semplici puntamenti nella giusta direzione potrebbero aiutare.

Grazie mille.

risposta

103

Mi sembra un semplice meccanismo di memorizzazione nella cache di Webview.

Il seguente dovrebbe fare quello che stai cercando:

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

Il metodo isNetworkAvailable() verifica la presenza di una connessione di rete attiva:

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

Infine, non dimenticate di aggiungere le seguenti tre permessi al tuo 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"/> 
+1

questo è davvero completo .. funziona come un fascino! grazie mille per avermi mostrato la modalità cache – mstation

+0

Nessun problema, lieto di averlo aiutato :) – jenzz

+0

@jenzz: Ho due problemi con la tua soluzione. Per prima cosa, nel mio caso, tutto ciò che appare nella directory cache (external sd card) è un file * vuoto * chiamato 'ApplicationCache.db'. Non dovrebbe essere più grande ?? Forse la cache viene archiviata altrove? In secondo luogo, la cosa '.setAppCacheMaxSize()' è deprecata in API18, non so come aggiungere più chache quindi ... –

16

h Esistono occasioni in cui una WebView non può essere memorizzata nella cache in modo nativo. Se l'intestazione della pagina contiene i seguenti campi, WebView non sarà in grado di memorizzare nella cache il contenuto di quella pagina. Cache-Control: no-store, no-cache Pragma: no-cache

In questo caso, sarà necessario modificare la proprietà della pagina sul server per risolvere il problema di memorizzazione nella cache.

Problemi correlati