在android中显示webview的缓存版本

发布于 2024-12-20 14:12:01 字数 953 浏览 0 评论 0原文

我正在尝试获取网站的 HTML5 离线缓存版本,以便在网络视图内网络中断时显示。

我已经重写了 onReceivedError ,当网络关闭时,会调用此方法。 问题是它显示一般的“网页不可用”消息。

我怎样才能让它显示页面的 HTML5 缓存版本? Web 应用程序的离线存储肯定可以正常工作,因为它在桌面版 Firefox 和 Chrome 中运行良好。

我知道我可以在 onReceivedError 中手动调用 loadData 到视图中,但我不确定从哪里可以获取 HTML5 缓存值。

注意:如果我在 loadData 中设置一些虚拟数据,例如 view.loadData(Uri.encode("

页面加载失败
然后点击返回(通过检测返回事件并调用 webview.goBack(); 然后缓存页面的版本显示正常,

以下是我添加的一些用于设置 webview 的代码行:

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
webview.getSettings().setAppCacheMaxSize(1024*1024*8);                         
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache");
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setJavaScriptEnabled(true);

I am trying to get the HTML5 offline cached version of a website to display when the network is down inside of a webview.

I have overridden onReceivedError ok, and when the network is down this method is called.
Problem is that it displays the generic "Web Page is not available" message.

How can I get it to display the HTML5 cached version of the page?
The offline storage of the webapp is definately working, as it works fine in the desktop version of Firefox and Chrome.

I know I can call loadData into the view manually in onReceivedError, but im not sure where I can get the HTML5 cached value from.

Note: If I set some dummy data in loadData such as view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8"); and then click back (by detecting back event and calling webview.goBack(); then the cached version of the page is displayed ok.

Here are some lines of code I added to setup the webview:

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
webview.getSettings().setAppCacheMaxSize(1024*1024*8);                         
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache");
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setJavaScriptEnabled(true);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

三岁铭 2024-12-27 14:12:01

尝试使用

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

(检测是否存在Android 上可用的互联网连接

这也需要

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在您的 AndroidManifest.xml 中

现在您可以将缓存行为设置为 LOAD_CACHE_ONLY 或 LOAD_NO_CACHE,具体取决于网络连接是否可用,

webview.getSettings().setCacheMode(...)

Try to find out the network status using

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

(Detect whether there is an Internet connection available on Android)

This also needs

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

in your AndroidManifest.xml

Now you can set the cache behaviour either to LOAD_CACHE_ONLY or to LOAD_NO_CACHE, depending on whether a network connection is available, with

webview.getSettings().setCacheMode(...)
赠佳期 2024-12-27 14:12:01

我认为一个好的解决方案是使用 LOAD_NORMAL 和 onReceivedError 导航返回。我认为这将根据文档加载缓存(不确定我是否记得正确),但要小心不要陷入无限循环


这很奇怪..根据 文档

覆盖缓存的使用方式。缓存的使用方式是基于
在导航选项上。对于正常的页面加载,会检查缓存
并根据需要重新验证内容。返回时,内容
不会重新验证,而是只是从缓存中提取内容。
此函数允许客户端覆盖此行为。

然而,您想要的行为似乎不是其中之一:

  1. LOAD_CACHE_ELSE_NETWORK

    <块引用>

    如果内容存在,即使过期(例如历史导航),也使用缓存。如果内容不在缓存中,则从网络加载。

  2. LOAD_CACHE_ONLY

    <块引用>

    不使用网络,仅从缓存加载。

  3. LOAD_DEFAULT

    <块引用>

    默认缓存使用模式

  4. LOAD_NORMAL

    <块引用>

    正常缓存使用模式

  5. LOAD_NO_CACHE

    <块引用>

    不使用缓存,从网络加载


我不知道您是否可以子类化 WebView 以获得所需的流量。


I think a good solution would be to use LOAD_NORMAL and onReceivedError Navigate BACK. I think this will load the cache according to the documentation (not sure if I remember correctly) but be carefull no to get stuck in an infinite loop


It is weird.. According to the documentation:

Override the way the cache is used. The way the cache is used is based
on the navigation option. For a normal page load, the cache is checked
and content is re-validated as needed. When navigating back, content
is not revalidated, instead the content is just pulled from the cache.
This function allows the client to override this behavior.

However the behavior you want does not seem to be one of these:

  1. LOAD_CACHE_ELSE_NETWORK

    Use cache if content is there, even if expired (eg, history nav) If it is not in the cache, load from network.

  2. LOAD_CACHE_ONLY

    Don't use the network, load from cache only.

  3. LOAD_DEFAULT

    Default cache usage pattern

  4. LOAD_NORMAL

    Normal cache usage pattern

  5. LOAD_NO_CACHE

    Don't use the cache, load from network


I do not know if you can subclass the WebView to get the desired flow.


放低过去 2024-12-27 14:12:01

如果直接让浏览器处理这个问题是不是就不行了?在 HTML 标记中指定清单,如下所示:

<html manifest="mycache.appcache">

...当没有可用连接时,浏览器应自动使用它,您根本不需要更改任何设置。

Does it not work if you simply let the browser handle this? Specify the manifest in the HTML tag like this:

<html manifest="mycache.appcache">

...and the browser should automatically use it when there's no connection available, you shouldn't need to change any settings at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文