【问题标题】:Saving WebView page to cache将 WebView 页面保存到缓存
【发布时间】:2013-09-04 07:17:31
【问题描述】:

我有一个带有 WebView 的应用程序,我希望该应用程序在第一次连接到 Internet 时保存网站,以便不再需要进一步连接。我知道有些人正在将 WebView 页面保存到缓存中。我做了一些研究,找到了一些答案,例如this one

但问题是我需要一些示例代码来说明如何执行此操作。谁能给我一个关于如何将网页 .html 文件保存到 Android 上的外部存储的示例?

这是我目前加载网页的唯一代码。

//Connecting to UI elements
webView = (WebView) findViewById(R.id.webView1);

//Loading WebView URL
webView.loadUrl("https://www.easistent.com/urniki/izpis/263/16515/0/0/1");

我需要一些示例代码。我在网上看到了很多文档和指南、示例,但我所做的一切都不起作用。如果有人给我一个 cmets 的例子,我将不胜感激。

【问题讨论】:

  • 您可能会遇到的一个问题是该特定页面声明了“Cache-Control:max-age=0”,这会阻止它被 Web 客户端放入缓存中(不仅如此,而且没有-缓存,过期...)

标签: java android caching android-webview


【解决方案1】:

可以直接使用WebView缓存。

通常,这是通过 WebSettings.setCacheMode 激活的,使用模式 LOAD_CACHE_ELSE_NETWORK

在可用时使用缓存资源,即使它们已过期。

这样使用:

webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

但是,在您的情况下,页面声明了一个“无缓存”选项,这可能会阻止 WebView 将页面完全存储在缓存中。

如果您有服务器端的经验,您还可以使用应用程序缓存 API(有关其工作原理的更多详细信息,请参阅 http://www.html5rocks.com/en/tutorials/appcache/beginner/

【讨论】:

  • 我的应用程序中已经有此代码。所以你是说我可能无法为这个网页保存缓存?是否有其他替代方法可以说 webview 页面以在没有连接的情况下查看它们?
  • 您必须更改页面以允许将其放入缓存中。
  • 否则你必须下载页面并在本地显示
  • 遗憾的是,我没有任何管理权限,该页面不是我的,所以我对此无能为力。您能给我有关如何下载并在本地显示的任何信息吗?也许我可以让它在每次有互联网连接时下载,这样它仍然会不时更新
  • 显然,您的页面由 3 个项目组成。一个 css、一个图像和一个 html 文件。 css 和 image 都应该支持缓存。您需要使用任何基本的 http 请求方法保存页面,将其保存在本地并将您的 web 视图指向它。显然图片和css url是绝对的,所以你不需要下载它们
【解决方案2】:

@yeradis(How I can Save WebView Contents to show even when no network available?):

也许使用缓存是最好的方法...你应该检查http://developer.android.com/reference/android/webkit/WebSettings.html

"管理 WebView 的设置状态。当第一次创建 WebView 时,它会获得一组默认设置。这些默认设置将从任何 getter 调用返回。从 WebView.getSettings() 获得的 WebSettings 对象绑定到WebView 的生命周期。如果 WebView 已被销毁,则对 WebSettings 的任何方法调用都将引发 IllegalStateException。"

特别是:

public static final int **LOAD_CACHE_ONLY**

自:API 级别 1 不使用网络,仅从缓存加载。与setCacheMode(int). Constant Value: 3 (0x00000003)一起使用

或者

public static final int **LOAD_CACHE_ELSE_NETWORK**

自:API 级别 1 如果内容存在,则使用缓存,即使已过期(例如,历史导航) 如果它不在缓存中,则从网络加载。与setCacheMode(int). Constant Value: 1 (0x00000001)一起使用

更新 1:

嗯“所有生命的蹩脚代码”例如:

public static InputStream fetch(String url) throws MalformedURLException,
        IOException {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
    HttpResponse response = httpClient.execute(request);
    return response.getEntity().getContent();
}


private static String convertStreamToString(InputStream is)
        throws IOException {

    StringWriter writer = new StringWriter();
    IOUtils.copy(is, writer, "UTF-8");
    return writer.toString();
}

因此,您可以使用 InputStream fetch(String url) 获取 url,然后使用私有静态 String convertStreamToString(InputStream is) 将该流转换为 String 并将该流保存到文件中,稍后您可以将该内容加载到 webview ...稍后阅读。

更新2:

或者你可以做一些Java序列化的东西......不记得这是否适用于android xD

发现 Java 序列化 API http://java.sun.com/developer/technicalArticles/Programming/serialization/ 的秘密

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2017-06-07
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多