如何离线使用缓存,否则使用网络

时间:2019-04-22 10:34:13

标签: java android android-webview

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

到目前为止非常好,除了即使在有可用网络的情况下,它始终使用缓存的版本。所以我想问一下下面的代码是否有问题。看来我想念什么。

我已经尝试了下面的代码,也没有。我发现了以下内容:无论我尝试什么,该应用程序似乎始终使用“缓存”版本。在这一点上,我什至不能确定它是否真正在使用缓存,因为当我清除了App Data(不是缓存)后,我只能让它再次从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");

2 个答案:

答案 0 :(得分:0)

问题出在LOAD_DEFAULT上。来自official documentation

  

LOAD_DEFAULT

     

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

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

在有网络的情况下尝试以下操作:

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

如果没有网络,请使用:

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

有关更多信息,请参见此answer

答案 1 :(得分:0)

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