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

时间:2018-05-31 23:46:03

标签: java android html webview

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

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

截至目前,我已设法检测是否存在互联网连接;如果没有连接,WebView会显示本地"错误"页面,存储在应用程序文件中 - 这比默认的Android"连接错误"更好屏幕,但用户在离线时仍然无法看到新闻Feed中的图片和文字信息,就像在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,但显然它没有被渲染。我也得到了#34;找不到文件"屏幕和白色屏幕上没有任何东西。

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

修改

正如评论中greenapps所建议的那样,我超越了" onPageFinished" WebViewClient中的方法并调用" saveWebArchive()"有:

@Override
public void onPageFinished(WebView view, String link) {

    view.saveWebArchive(path);
    showMsg("Finished loading");

}

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

2 个答案:

答案 0 :(得分:0)

此处的问题是,在尝试将页面保存到存档之前,您需要等待页面完成加载。

ArticleDetails
由于页面尚未完全加载,

将无效。因此,您需要覆盖WebViewClient中的“onPageFinished”方法,以便仅在页面完成时保存存档:

[HttpGet("article/{articleId}/{slug}")]
public IActionResult ArticleDetails(int articleId, string slug)
{
    // some code ...

    return View(data);
}

请注意,我使用了webView.loadUrl(url); webView.saveWebArchive(path); ,因为页面加载时会有一个jQuery动画,所以它会等待2秒钟完成动画,然后保存网页存档。

答案 1 :(得分:0)

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

您无法在此处保存该页面。

太早了。

页面尚未加载。

在onPageLoaded()或onPageFinished()中执行此操作。