2013-11-25 2 views
8

Ich habe an einer Anwendung gearbeitet, die ein Bild aus dem Internet zwischenspeichert und es zeigt, auch wenn der Benutzer offline ist. Das funktionierte ziemlich gut, bis Android 4.4 herauskam. Nun, alles, was ich sehe, ist ein Fehler "Kann die Webseite nicht laden". Ich nehme an, es könnte etwas damit zu tun haben, dass Kitkat Chromium zum Laden von Webansichten verwendet, aber ich bin mir nicht sicher. Irgendwelche Korrekturen dafür?WebView Cache funktioniert nicht in Android 4.4

Hier ist mein Code:

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

ich es bin Laden mit dem folgenden Code:

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

Sie sehen immer den Fehler (in welchem ​​Fall - was möchten Sie laden?) Oder sehen Sie es nur im Offline-Modus? Auch - unabhängig, aber warum setzen Sie den Layer-Typ auf Software? Dies führt normalerweise zu einer schlechten Scroll-Perf. –

+0

Der Fehler tritt nur auf, wenn die Internetverbindung ausgeschaltet ist. Und danke für den Rat, werde versuchen, den Unterschied zu sehen. – rahulritesh

+0

Werfen Sie einen Blick auf die Änderungen für Android 4.4 http://developer.android.com/about/versions/android-4.4.html#Behaviors –

Antwort

3

Verstanden mich gelöst. Ich habe herausgefunden, dass Chromium Bilder mit einer Größe von mehr als 1 MB nicht zwischenspeichert. In anderen Fällen funktioniert es einwandfrei. Berichtete dies zunächst Google.

+0

Haben Sie einen Hinweis auf den Chromium Bug? – ksasq

+0

Für den Rekord: Nach dem Namen und Datum zu urteilen scheint es [diese Ausgabe] (https://code.google.com/p/android/issues/detail?id=63501), wegen fehlender Informationen geschlossen zu sein. – benebun

0

Ja, das ist wegen der folgenden Probleme:

http://code.google.com/p/android/issues/detail?id=63501(! Müssen wieder geöffnet werden cc Rahulrit)

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

Einige Hacks:

1> if Sie verwenden Ihren eigenen Server Ändern Sie die Webserver-Implementierung für MultipartCache, so dass Bilder w krank als Teil für Teil gespeichert, Dies ist nicht die richtige Lösung, versuchen Sie es!

2> Eine andere Lösung ist es, alle HTML-Datei in der Lagerung wie this (nicht empfohlen) speichern

// 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()); 

Credit: Nazar Merza

Hinweis: Alle diese Lösung noch nicht zu 100% ige Lösung über Problem! Wir können dies als eine vorübergehende Lösung verwenden!