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

标签 java android android-webview

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

到目前为止一切顺利,除了它始终使用缓存版本,即使有网络可用。所以想请教一下下面的代码有没有问题。看来我漏掉了一些东西。

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

安卓版本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 获取网站。之后,它将仅使用缓存的版本。 (或者可能是存储在应用程序数据中的版本。不确定它是如何工作的。)

更新:

我成功了,现在看起来像这样:(不过不确定这是否是“最佳实践”方法)

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

最佳答案

问题出在 LOAD_DEFAULT 上。来自 official documentation :

LOAD_DEFAULT

Default cache usage mode. If the navigation type doesn't impose any specific behavior, use cached resources when they are available and not expired, otherwise load resources from the network.

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

有网络时尝试此操作:

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

当没有网络时,使用:

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

查看此answer了解更多信息。

关于java - 如何离线使用缓存,否则使用网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55792980/

相关文章:

java - 从 Java 中的字符串中提取浮点值

html - 如何使用android向webview显示html内容

android - 在 android webview 中更改用户代理意味着什么?

java - 如果队列/数据库出现故障,何时关闭消息处理?

java - 两个字符串相等,但不适用于 if 语句

java - 范围为 'runtime' 的 Maven 依赖项如何有用(使用)?

android - Aviary 与 Android Studio 集成 : Could not find com. aviary.android.feather.sdk :aviary-sdk:3. 4.3.350

android - 用于从两个不同的视频和两个不同的音频创建最终视频的 ffmpeg 命令

android - 如何写入和读取具有自定义扩展名的文本文件?

javascript - Android 网页 View : console is not defined