我的Android应用程序中有一个用于显示某些数据的WebView,我手动将其转换为HTML格式(它没有显示真正的网页,而是我给它显示了一些HTML)。
数据来自网络服务,因此需要一些时间来加载。现在,当用户离开此活动并再次返回时,数据将从Web服务重新加载并再次显示,因此用户必须等待加载。但是,10次中的9次(甚至更多)数据将与上次相同,因此这只是浪费时间。因此,我现在正在尝试实现一些基本的缓存:
我在最后一步遇到了麻烦。现在我只是给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而不必完全重新加载所有内容吗?谢谢!
答案 0 :(得分:0)
您必须使WebView的行为就像是一个webapp一样。每次调用loadDataWithURL时,都会重新加载页面,就好像它是新鲜的一样。
避免这种情况的一种方法是通过JavaScript桥接器与代码的Java端进行JavaScript接口。通过将数据从Java端传递到JavaScript函数,您可以更新WebView ui而无需完全重新加载。
在WebView中获得数据后,更新HTML取决于视图的外观。
如果您搜索“JavaScript DOM updates”和“Android JavaScript bridge”,可以使用许多演示。