2013-11-25 15 views
8

Ho lavorato a un'applicazione che memorizza nella cache un'immagine dal web e la mostra anche quando l'utente è offline. Questo ha funzionato abbastanza bene fino all'uscita di Android 4.4. Ora, tutto quello che vedo è un errore "Impossibile caricare la pagina web". Suppongo che potrebbe dover fare qualcosa con il fatto che Kitkat usa Chromium per caricare le visioni web, ma non ne sono molto sicuro. Qualche correzione per questo?La cache di WebView non funziona su Android 4.4

Ecco il mio codice:

mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
mWebView.setWebViewClient(new MyWebViewClient()); 

mWebViewSettings = mWebView.getSettings(); 
mWebViewSettings.setJavaScriptEnabled(true); 
mWebViewSettings.setAllowFileAccess(true); 
mWebViewSettings.setAppCacheEnabled(true); 
if (Build.VERSION.SDK_INT < 18) 
    mWebViewSettings.setAppCacheMaxSize(5 * 1024 * 1024); // 5MB 
mWebViewSettings.setLoadsImagesAutomatically(true); 
mWebViewSettings.setAppCachePath(getActivity().getApplicationContext() 
     .getCacheDir().getAbsolutePath()); 
mWebViewSettings.setBuiltInZoomControls(true); 
if(Build.VERSION.SDK_INT<=18) 
    mWebViewSettings.setDefaultZoom((WebSettings.ZoomDensity.FAR)); 
mWebViewSettings.setUseWideViewPort(true); 
mWebViewSettings.setLoadWithOverviewMode(true); 

sto caricarlo utilizzando il seguente codice:

if (NetworkUtil.IS_ONLINE_WITH_DATA_CONNECTION) { 

    MyPrefs = getActivity().getSharedPreferences(
      "AHSelectionPreffs", 
        Context.MODE_PRIVATE); 
    Date CAMPUS_MAP_LAST_UPDATE_DATE = new Date(); 
    String CAMPUS_MAP_LAST_UPDATE_DATE_STRING = MyPrefs 
       .getString("CAMPUS_MAP" + String.valueOf(StorageHelper.ID), null); 

    SimpleDateFormat simpleDateFormatter = new SimpleDateFormat(
          "EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); 

    if (CAMPUS_MAP_LAST_UPDATE_DATE_STRING != null) { 
     try { 
      CAMPUS_MAP_LAST_UPDATE_DATE = simpleDateFormatter 
        .parse(CAMPUS_MAP_LAST_UPDATE_DATE_STRING); 

     } catch (ParseException e1) { 

      e1.printStackTrace(); 
      System.out.println("Cant format date!!!!"); 
     } 
     int n = (int) ((curDate.getTime() - CAMPUS_MAP_LAST_UPDATE_DATE 
           .getTime())/(1000 * 60 * 60)); 

     if (n < 24 * UPDATE_DURATION_IN_DAYS) { 
      mWebView.getSettings().setCacheMode(
            WebSettings.LOAD_CACHE_ELSE_NETWORK); 

     } else { 
      updateCampusMapData(); 

     } 
    } else { 

     updateCampusMapData(); 

    } 

} else { 
    mWebView.getSettings().setCacheMode(
        WebSettings.LOAD_CACHE_ELSE_NETWORK); 
} 

if (StorageHelper.campus_map_link.Mobile_Link_URL != null) { 
     mWebView.loadUrl(StorageHelper.campus_map_link.Mobile_Link_URL); 

} 

private void updateCampusMapData() { 
    mWebView.getSettings().setCacheMode(
     WebSettings.LOAD_NO_CACHE); 
    MyPrefs = getActivity().getSharedPreferences(
     "AHSelectionPreffs", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = MyPrefs.edit(); 
    editor.putString("CAMPUS_MAP" + String.valueOf(StorageHelper.ID), 
         curDate.toString()); 
    editor.commit(); 

} 
+0

Si vede sempre l'errore (nel qual caso - cosa stai cercando di caricare?) O lo vedi solo in modalità offline? Inoltre, non correlato, ma perché stai impostando il tipo di livello su software? Ciò di solito si traduce in cattivi scrolling perf. –

+0

L'errore si verifica solo quando la connessione Internet è disattivata. E grazie per il consiglio, proverò a vedere la differenza. – rahulritesh

+0

Dai un'occhiata alle modifiche per Android 4.4 http://developer.android.com/about/versions/android-4.4.html#Behaviors –

risposta

3

Got io stesso risolto. Ho capito che Chromium non memorizza nella cache immagini di dimensioni superiori a 1 MB. In altri casi, funziona perfettamente. Segnalato a Google, per ora.

+0

Hai un riferimento al bug di Chromium? – ksasq

+0

Per la cronaca: a giudicare dal nome e dalla data sembra essere [questo problema] (https://code.google.com/p/android/issues/detail?id=63501), chiuso a causa della mancanza di informazioni. – benebun

0

Sì questo è a causa dei seguenti problemi:

http://code.google.com/p/android/issues/detail?id=63501(! Bisogno di essere riaperto cc Rahulrit)

http://code.google.com/p/chromium/issues/detail?id=240043

alcuni hack:

1> se si sta utilizzando il proprio server modificare l'implementazione del server Web per MultipartCache in modo tale che le immagini w memorizzato male come parte per parte, questa non è la soluzione giusta provatelo!

2> Un'altra soluzione è quella di salvare tutti i file HTML in nella memoria come this (non raccomandato)

// saving page from web to file 
File file = new File(this.getExternalFilesDir(null), "fileName.html"); 
FileUtils.copyURLToFile(new URL("http://www.bmimobile.co.uk/why-bmi.php"), file); 
// loading saved file in webview 
webview.loadUrl("file://" + file.getPath()); 

credito: Nazar Merza

Nota: Tutti questi soluzione non sono la soluzione al 100% per sopra il problema! possiamo considerarlo come una soluzione temporanea!

Problemi correlati