我正在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/file
,file:///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");
}
当手机连接到互联网并加载主页时,它会显示"已完成加载"。关闭应用程序后,断开连接并再次打开它,它现在显示一个空白背景,其中包含原始页面的颜色,不再有白页或错误消息。但是没有任何图像,文字或任何东西。
答案 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()中执行此操作。