2011-12-11 10 views
9

Sto cercando di ottenere la versione cache offline di un sito Web HTML5 da visualizzare quando la rete si trova all'interno di una webview.visualizza la versione cache di webview in android

Ho ignorato onReceivedError ok, e quando la rete non funziona, questo metodo viene chiamato. Il problema è che visualizza il messaggio generico "Pagina Web non disponibile".

Come posso ottenere per visualizzare la versione cache HTML5 della pagina? La memoria offline della webapp funziona in modo definitivo, poiché funziona bene nella versione desktop di Firefox e Chrome.

So che posso chiamare loadData nella vista manualmente in onReceivedError, ma non sono sicuro da dove posso ottenere il valore memorizzato nella cache HTML5.

Nota: Se ho impostato alcuni dati fittizi in loadData quali view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8"); e quindi fare clic su indietro (rilevando indietro evento e chiamare webview.goBack(); quindi la versione cache della pagina viene visualizzata ok

Ecco alcune righe di codice. ho aggiunto per impostare il WebView:.

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); 
webview.getSettings().setAppCacheMaxSize(1024*1024*8);       
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache"); 
webview.getSettings().setAllowFileAccess(true); 
webview.getSettings().setAppCacheEnabled(true); 
webview.getSettings().setDomStorageEnabled(true); 
webview.getSettings().setJavaScriptEnabled(true); 

risposta

6

cercare di scoprire lo stato della rete utilizzando

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

(Detect whether there is an Internet connection available on Android)

Questo deve anche

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

nel vostro AndroidManifest.xml

Ora è possibile impostare il comportamento della cache sia per LOAD_CACHE_ONLY o LOAD_NO_CACHE, a seconda se una connessione di rete è disponibile, con

webview.getSettings().setCacheMode(...) 
+0

questa è probabilmente la soluzione più "pulita", quindi non ti dare i punti di merito :) – Marty

2

penso che una buona soluzione sarebbe quella di utilizzare LOAD_NORMAL e onReceivedError tornare indietro credo che questo caricherà la cache in base alla documentazione (non so se non ricordo male), ma essere attenzione a non rimanere bloccati in un ciclo infinito


E 'strano .. Secondo il documentation:

Override il modo in cui la cache viene utilizzata. Il modo in cui viene utilizzata la cache è basato su sull'opzione di navigazione. Per un normale caricamento della pagina, la cache viene controllata e il contenuto viene nuovamente convalidato in base alle esigenze. Quando si ritorna indietro, il contenuto non viene riconvalidato, ma il contenuto viene semplicemente estratto dalla cache. Questa funzione consente al client di ignorare questo comportamento.

Tuttavia il comportamento desiderato non sembra essere uno di questi:

  1. LOAD_CACHE_ELSE_NETWORK

    Usa la cache se il contenuto è lì, anche se è scaduto (ad esempio, la storia nav) Se non è nella cache, carica dalla rete.

  2. LOAD_CACHE_ONLY

    Non utilizzare la rete, il carico da solo di cache.

  3. LOAD_DEFAULT

    modello di utilizzo della cache di default

  4. LOAD_NORMAL

    modello di utilizzo della cache normale

  5. LOAD_NO_CACHE

    Non utilizzare la cache, il carico dalla rete


Non so se si può sottoclasse il WebView per ottenere il flusso desiderato.


+0

dispiace dimenticato di dire, ho modificato la mia domanda .. – Marty

+0

@Marty ha fatto si tenta di modificare LOAD_DEFAULT a LOAD_NORMAL –

+0

ancora solo ha generico "Pagina Web non disponibile" quando la connessione di rete è giù quando uso LOAD_NORMAL – Marty

1

Fa non funziona se si semplicemente lasciare il browser gestire questo? Specificare il manifesto nel tag HTML come questo:

<html manifest="mycache.appcache"> 

... e il browser dovrebbe utilizzare automaticamente quando non c'è alcuna connessione disponibile, non dovrebbe essere necessario modificare le impostazioni a tutti.

0

È necessario innanzitutto impostare l'autorizzazione nel dispositivo Android01ifest .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"/> 

Poi controllare rete internet è acceso o spento da:

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

Finalmente aggiungere sotto il codice con il tuo Webview oggetto

webView = (WebView) findViewById(R.id.WebEngine); 
     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); 
     if (!isNetworkAvailable()) { // loading offline 
      webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 
     } 
webView.loadUrl("http://www.geekonjava.blogspot.com/?m=1"); 

Quello è se il vostro internet è su la tua pagina web open versi normale su e salvato nella cache e se il tuo telefono è spento allora automaticamente aperto nella versione cache.

Problemi correlati