2013-11-25 76 views
8

我一直在研究一個應用程序,從網上緩存圖像,甚至當用戶離線時顯示它。這個工作很好,直到Android 4.4出來。現在,我看到的只是一個「無法加載網頁」錯誤。我想這可能需要做一些事實,Kitkat使用Chromium來加載webviews,但我不太確定。任何修補程序?WebView緩存不工作在Android 4.4

這裏是我的代碼:

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

我使用下面的代碼加載它:

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

你是否總是看到錯誤(在哪種情況下 - 你想要加載什麼?)或者你只能在脫機模式下看到它? 也 - 無關,但你爲什麼設置圖層類型爲軟件?這通常會導致不良的滾動性能。 –

+0

僅當互聯網連接關閉時纔會發生錯誤。並感謝您的建議,將嘗試看到不同之處。 – rahulritesh

+0

查看Android 4.4的更改http://developer.android.com/about/versions/android-4.4.html#Behaviors –

回答

3

得到它解決了自己。我發現Chromium沒有緩存大小超過1 MB的圖像。在其他情況下,它工作得很好。現在報告給Google。

+0

你有沒有參考Chromium bug? – ksasq

+0

備案:根據名稱和日期來判斷[此問題](https://code.google.com/p/android/issues/detail?id=63501),由於缺乏信息而被關閉。 – benebun

0

是的,這是因爲以下問題的:

http://code.google.com/p/android/issues/detail?id=63501(!需要重新打開CC Rahulrit)

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

一些黑客:

1>如果您正在使用自己的服務器更改MultipartCache的Web服務器實現,以便圖像w不適合部分存儲,這不是正確的解決方案試試吧!

2>另一種解決方案是保存所有的HTML文件中存儲像this(不推薦)

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

信用:Nazar Merza

注:所有這些解決方案都沒有100%的解決方案以上問題!我們可以把它作爲一個臨時修復!