Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android WebView-无需重新加载即可设置HTML_Android_Caching_Webview_Loaddata - Fatal编程技术网

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

Android WebView-无需重新加载即可设置HTML,android,caching,webview,loaddata,Android,Caching,Webview,Loaddata,我的Android应用程序中有一个WebView,用于显示一些数据,我手动将其转换为HTML格式。它不是显示真实的网页,而是提供一些HTML来显示 数据来自Web服务,因此需要一些时间来加载。现在,当用户离开此活动并再次返回时,数据将从webservice重新加载并再次显示,因此用户必须等待加载。然而,10次中有9次甚至更多的数据将与上次相同,所以这只是浪费时间。因此,我现在尝试实现一些基本的缓存: 每当接收到数据时,它都被缓存在内存中; 每当请求相同的数据时,首先从内存加载(如果可用); 加载

我的Android应用程序中有一个WebView,用于显示一些数据,我手动将其转换为HTML格式。它不是显示真实的网页,而是提供一些HTML来显示

数据来自Web服务,因此需要一些时间来加载。现在,当用户离开此活动并再次返回时,数据将从webservice重新加载并再次显示,因此用户必须等待加载。然而,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而不让它完全重新加载所有内容吗?谢谢

您必须使您的WebView表现得像一个webapp。每次调用loadDataWithURL时,都会像重新加载页面一样重新加载页面

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

一旦在WebView中有了数据,更新HTML就取决于视图的外观

如果您在“JavaScriptDOM更新”和“Android JavaScriptBridge”上搜索,有许多演示可用