如何将网页另存为网页存档,然后使用Android的WebView将网页存档显示为网页?



我正在Android Studio 3.0.1,Xubuntu 16.04 LTS中开发Android应用程序,使用WebView作为响应式Web应用程序的包装器,其中包含HTML,CSS,JavaScript/jQuery,并使用PHP/MySQL作为后端。几乎所有事情都按预期工作:页面完全呈现,JavaScript运行,注册/登录/新闻源系统正常工作。

但是现在我想实现某种简单的缓存系统,以便用户在没有互联网连接时仍然可以看到页面的最后可用版本。

截至目前,我已经设法检测到是否有互联网连接;如果没有连接,WebView会显示一个本地"错误"页面,存储在应用程序文件中 - 这比默认的Android"连接错误"屏幕更好,但用户仍然无法看到离线时新闻提要中的图像和文本帖子,就像在Facebook应用程序中一样。

我尝试过什么(Java/Android Studio(:

当用户打开应用(onCreate(时

  • 如果没有连接,请检查它尝试检索的页面的本地保存版本;如果存在连接,请将页面另存为 .mht 文件以供下次使用:

    if (!isConnected()) {
    try {
    File file = new File(getFilesDir(), FilenameUtils.getBaseName(url));
    webView.loadUrl("file://" + file.getAbsolutePath() + ".mht");
    } catch (Exception e) {
    Toast.makeText(getApplicationContext(), "Exception detected", Toast.LENGTH_LONG).show();
    }
    } else {
    try {
    File file = new File(getFilesDir(), FilenameUtils.getBaseName(url));
    webView.loadUrl(url);
    webView.saveWebArchive("file://" + file.getAbsolutePath() + ".mht");
    } catch (Exception e) {
    Toast.makeText(getApplicationContext(), "Exception detected", Toast.LENGTH_LONG).show();
    }
    }
    

我尝试使用具有不同路径的webView.saveWebArchive(),包括简单的/path/to/filefile:///path/to/file等,但无济于事。我最接近在 WebView 上显示某些内容的是一堆原始 MHTML,但显然它没有渲染。我还得到了"找不到文件"屏幕和没有任何内容的纯白屏幕。

如何将网页从 WebView 正确保存到 Web 存档中,然后从本地存储中检索并再次将其显示为网页?

编辑:

正如greenapps在评论中建议的那样,我在WebViewClient中覆盖了"onPageDone"方法,并在那里调用了"saveWebArchive((":

@Override
public void onPageFinished(WebView view, String link) {
view.saveWebArchive(path);
showMsg("Finished loading");
}

当手机连接到互联网并加载主页时,它会显示"已完成加载"。关闭应用程序,断开连接并再次打开后,它现在显示带有原始页面颜色的空白背景,不再有白页或错误消息。但是没有任何图像,文本或任何东西。

webView.loadUrl(url); 
webView.saveWebArchive("file://" + file.getAbsolutePath() + ".mht");. 

您无法在此处保存页面。

太早了。

页面尚未加载。

在 onPageLoaded(( 或 onPageDone(( 中执行此操作。

这里的问题是您需要等待页面完成加载,然后再尝试将其保存到存档。

webView.loadUrl(url);
webView.saveWebArchive(path);

无法正常工作,因为页面尚未完全加载。因此,您需要覆盖WebViewClient中的"onPageDone"方法,以便仅在页面完成时保存存档:

webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
if (isConnected()) {
try {
Thread.sleep(2000);
view.saveWebArchive(path_to_saveDir);
} catch (InterruptedException e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
});

请注意,我使用了Thread.sleep(2000),因为页面加载时有一个 jQuery 动画,因此它会等待 2 秒钟以完成动画,然后保存 Web 存档。

最新更新