Android WebView - 无需重新加载即可设置HTML

时间:2013-08-10 22:27:20

标签: android caching webview loaddata

我的Android应用程序中有一个用于显示某些数据的WebView,我手动将其转换为HTML格式(它没有显示真正的网页,而是我给它显示了一些HTML)。

数据来自网络服务,因此需要一些时间来加载。现在,当用户离开此活动并再次返回时,数据将从Web服务重新加载并再次显示,因此用户必须等待加载。但是,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 个答案:

答案 0 :(得分:0)

您必须使WebView的行为就像是一个webapp一样。每次调用loadDataWithURL时,都会重新加载页面,就好像它是新鲜的一样。

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

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

如果您搜索“JavaScript DOM updates”和“Android JavaScript bridge”,可以使用许多演示。