【问题标题】:How to use Cache offline, else use network如何离线使用缓存,否则使用网络
【发布时间】:2019-04-22 10:34:13
【问题描述】:

我正在尝试创建一个显示 WebView 的应用程序。我希望它在没有网络时显示缓存版本。否则,如果有可用的网络,它应该从 URL 加载 WebView。

到目前为止一切顺利,除了它一直使用缓存版本,即使有可用网络。所以我想问一下下面的代码是否有任何问题。我好像漏掉了什么。

我用下面的代码都试过了,没有它。我发现以下内容:无论我尝试什么,该应用程序似乎总是使用“缓存”版本。在这一点上,我什至不确定它是否真的在使用缓存,因为当我清除应用数据(而不是缓存)时,我只能让它再次从 URL 加载网站。

Android 版本 6.0.1 API 级别 23

mWebView.getSettings().setAppCachePath(getApplicationContext().getCacheDir().getAbsolutePath() );
mWebView.getSettings().setAllowFileAccess( true );
mWebView.getSettings().setAppCacheEnabled( true );
mWebView.getSettings().setJavaScriptEnabled( true );
mWebView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );

if ( !isNetworkAvailable() ) { // loading offline
mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
}

mWebView.loadUrl("https://path.to.my/website/index.html");

预期结果:当手机有网络时,我希望它从 URL 中获取网站。

实际结果:全新安装时,已经从 url 中获取了网站。之后,它将只使用缓存的版本。 (或者可能是存储在 App Data 中的版本。不确定它是如何工作的。)

更新:

我让它工作了,现在看起来像这样:(但不确定这是否是“最佳实践”方式)

WebSettings webSettings = mWebView.getSettings();

        webSettings.setAppCacheEnabled(true);
        webSettings.setAllowFileAccess( true );
        webSettings.setAppCachePath(getBaseContext().getCacheDir().getPath());
        //webSettings.setJavaScriptEnabled( true );

        if ( !isNetworkAvailable() ) { // loading offline
            webSettings.setCacheMode( WebSettings.LOAD_CACHE_ONLY );
            Toast.makeText(mContext, "DEBUG: No net",Toast.LENGTH_SHORT).show();
        }

        mWebView.loadUrl("https://path.to.my/website/index.html");

【问题讨论】:

    标签: java android android-webview


    【解决方案1】:

    问题在于LOAD_DEFAULT。来自official documentation

    LOAD_DEFAULT

    默认缓存使用模式。如果导航类型不强制执行任何特定行为,则在可用且未过期时使用缓存资源,否则从网络加载资源。

    当您希望它从网络加载时,它会从缓存中加载。

    有网络的时候试试这个:

    mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    

    当没有网络时,使用:

    mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
    

    请参阅此answer 了解更多信息。

    【讨论】:

    • 感谢您的帮助!然而,这并没有解决它。只有手动清除应用程序数据才能从 URL 加载。我尝试过同时使用 Wi-fi 和普通移动网络。 (如果 isNetworkAvailable() 没有在 Wi-fi 上触发,只能在移动设备上触发)。还是没有运气。
    • 也许不打电话给setAppCacheEnabled(true)setAppCachePath(path)会有帮助
    • 感谢您的建议。没有工作,很遗憾。我已经通过删除 setJavaScriptEnabled(true) 并删除 webSettings.setCacheMode( WebSettings.LOAD_NO_CACHE); 来让它工作我已经更新了我的原始帖子。
    【解决方案2】:
       if (!isNetworkAvailable()) { // loading offline
            mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
       } else {
         mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      相关资源
      最近更新 更多