Android WebView - 在不重新加载的情况下设置 HTML

Posted

技术标签:

【中文标题】Android WebView - 在不重新加载的情况下设置 HTML【英文标题】:Android WebView - set HTML without reloading 【发布时间】:2013-08-12 13:56:16 【问题描述】:

我的 android 应用程序中有一个 WebView,用于显示一些数据,我手动将其塑造成 html 格式(它没有显示真实的网页,而是给它一些 HTML 来显示)。

数据来自网络服务,因此需要一些时间来加载。现在,当用户离开此活动并再次返回时,数据将从网络服务重新加载并再次显示,因此用户必须等待它加载。但是,10 次中有 9 次(甚至更多)数据将与上次相同,所以这只是浪费时间。因此,我现在正在尝试实现一些基本的缓存:

无论何时接收到数据,它都会缓存在内存中; 每当请求相同的数据时,它首先从内存中加载(如果可用); 加载缓存数据后,正在后台从 web 服务加载新数据 此后台加载完成后,缓存数据应使用新数据“无缝”更新。

我在最后一步遇到问题。现在我只是给 WebView 一些 HTML 来处理:

    builder.append("<html><head><link rel=\"stylesheet\" href=\"file:///android_asset/style.css\" type=\"text/css\">");
    builder.append("</link>");
    builder.append("</head><body>");
    builder.append(getBody(data));
    builder.append("</body></html>");

    webContents.loadDataWithBaseURL("file:///android_asset/", builder.toString(), "text/html", "utf-8", null);

我只是先用缓存的数据调用这段代码,然后(在接收到新数据后)用更新的数据调用这段代码。

结果是 WebView 完全重新加载;它会跳回页面顶部(大多数页面都很长,因此用户会向下滚动一点),更糟糕的是它会在几分之一秒内变为空白,然后开始重新加载所有内容(尤其是在有图像时很明显)必须显示)。

我想避免这种明显的数据更新。我对突然弹出的小变化很好(就像中间的一段文字变得稍微长一点导致页面滚动一点),但是完全滚动到顶部非常烦人,并且完全空白并且必须重新加载所有内容是真的不能接受。

我有什么聪明的办法可以避免这些问题吗?我可以在不完全重新加载所有内容的情况下“更新”WebView 的 HTML 吗?谢谢!

【问题讨论】:

【参考方案1】:

你将不得不让你的 WebView 表现得像一个 webapp。每次调用 loadDataWithURL 时,您都在重新加载页面,就好像它是新鲜的一样。

避免这种情况的一种方法是通过 javascript 桥使 JavaScript 与代码的 Java 端交互。通过将数据从 Java 端传递到 JavaScript 函数,您无需完全重新加载即可更新 WebView ui。

一旦您在 WebView 中获得数据,更新 HTML 取决于您的视图是什么样的。

如果您搜索“JavaScript DOM 更新”和“Android JavaScript 桥”,则有许多可用的演示。

【讨论】:

以上是关于Android WebView - 在不重新加载的情况下设置 HTML的主要内容,如果未能解决你的问题,请参考以下文章

在不重新加载页面的情况下切换 webview 活动

Android webview如何检测何时重新加载

在不重新加载 web 视图的情况下更改 html 文本颜色

Android如何在屏幕关闭/打开时防止webview重新加载?

Android WebView 防止页面重新加载

Android - 恢复 Fragment WebView 状态以避免重新加载