【问题标题】:WebView Cache not working in Android 4.4WebView 缓存在 Android 4.4 中不起作用
【发布时间】:2013-11-25 13:04:24
【问题描述】:

我一直在开发一个应用程序,它可以缓存来自网络的图像并在用户离线时显示它。在 Android 4.4 出现之前,这一直运行良好。现在,我看到的只是“无法加载网页”错误。我想这可能与 Kitkat 使用 Chromium 加载 webviews 的事实有关,但我不太确定。有什么解决办法吗?

这是我的代码:

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

}

【问题讨论】:

  • 您是否总是看到错误(在这种情况下 - 您要加载什么?)还是仅在离线模式下看到?也 - 不相关,但你为什么将图层类型设置为软件?这通常会导致滚动性能不佳。
  • 只有在关闭互联网连接时才会出现该错误。感谢您的建议,会尝试看看有什么不同。
  • 没有什么可以解释我在应用中看到的行为。

标签: android caching android-webview android-4.4-kitkat


【解决方案1】:

自己解决了。我发现 Chromium 没有缓存大小大于 1 MB 的图像。在其他情况下,它工作得非常好。暂时将此事报告给 Google。

【讨论】:

  • 你有提到 Chromium 错误吗?
  • 备案:从名称和日期来看,似乎是this issue,由于缺乏信息而关闭。
【解决方案2】:

是的,这是因为以下问题:

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

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

一些技巧:

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

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% 解决上述问题!我们可以将其视为临时解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多