Android 4.4中的WebView缓存无法正常工作

8
我一直在开发一款应用程序,可以缓存来自网络的图片,即使用户离线也可以显示。这个功能一直很好,直到 Android 4.4 发布后出现了问题。现在,我只看到一个“无法加载网页”的错误。我猜测这可能与 Kitkat 使用 Chromium 加载 Webview 有关,但我不太确定。有没有解决方法?
以下是我的代码:
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();

}

你是否经常看到错误(如果是这种情况-您试图加载什么?)还是只在离线模式下看到它? 另外-虽然与此无关,但您为什么要将图层类型设置为软件?这通常会导致滚动性能不佳。 - marcin.kosiba
只有在断开互联网连接时才会出现错误。谢谢建议,我会尝试并看到区别的。 - rahulritesh
请查看Android 4.4的更改 http://developer.android.com/about/versions/android-4.4.html#Behaviors - Srikanth Pai
没有任何东西可以解释我在我的应用程序中看到的行为。 - rahulritesh
2个回答

3

我已经解决了这个问题。我发现Chromium不会缓存大小大于1 MB的图像。在其他情况下,它可以正常工作。我已经向谷歌报告了这个问题。


您有Chromium bug的参考吗? - ksasq
记录一下:根据名称和日期来看,似乎是这个问题,因缺乏信息而关闭。 - benebun

0

是的,这是由于以下问题:

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

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

一些技巧:

1>如果您正在使用自己的服务器,请更改MultipartCache的Web服务器实现,使图像按部分存储,这不是正确的解决方案,请尝试!

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%!我们可以将其视为临时修复!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接