5

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

但问题是我需要一些关于如何做到这一点的示例代码。有人可以给我一个关于如何将网页 .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");

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

4

2 回答 2

15

可以直接使用 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/ )

于 2013-09-06T12:26:49.773 回答
1

@yeradis(即使没有可用的网络,我如何保存 WebView 内容以显示?):

也许使用缓存是最好的方法......为此你应该检查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/

于 2013-09-06T12:25:16.360 回答