1

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

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

  • 每当接收到数据时,它都会缓存在内存中;
  • 每当请求相同的数据时,它首先从内存中加载(如果可用);
  • 加载缓存数据后,后台正在从webservice加载新数据
  • 当这个后台加载完成时,缓存的数据应该用新数据“无缝”更新。

我在最后一步遇到了麻烦。现在我只是给 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 吗?谢谢!

4

1 回答 1

0

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

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

在 WebView 中获得数据后,更新 HTML 取决于您的视图的外观。

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

于 2013-08-11T05:10:35.843 回答