后台:我有一个工作的应用程序,它通过读取HttpURLConnection
的响应来填充webview数据,对标记运行一些处理,然后将完整的字符串提供给{{1显示页面。这种方法有效,但是具有消除部分加载文档的并发处理的性能缺点,默认情况下,在任何浏览器或webview中正常加载页面时都会发生。
目标:我想将我的应用程序更改为流式传输模型而不是两步串行流程。简而言之,我正在调查我是否可以摆脱这个:
到此:
对于额外的皱纹,webview页面同时使用http://和file:/// android_asset请求,这在我当前的设置中正常工作。我主要难以保留对这两者的访问权限。旁注:我支持API v14 +。
以下是我当前尝试的简化代码摘要。
WebView.loadDataWithBaseUrl
正如所写,这通过// -- Setup --
WebView webview = makeWebView(); // WebSettings, JS on, view setup, etc
String url = "http://mywebsite.com";
InputStream is = getResponseStreamFromNetwork(url);
// -- Current data injection code --
String completeMarkup = readEverythingAtOnce(is);
webview.loadDataWithBaseUrl(url, completeMarkup, "text/html", "UTF-8", url);
// -- Ideal future data injection code --
webview.loadDataWithBaseUrl(url, "", "text/html", "UTF-8", url);
String line = null;
while ((line = is.readLine()) != null) {
appendToWebView(webview, line);
}
finishWebView(webview);
// -- The hard bits --
void appendToWebView(WebView webview, String line) {
// Inject a partial markup string to the end of the webview's content.
webview.loadUrl("javascript:document.write('" + line.replace("'", "\\'") + "\\n');");
}
void finishWebView(WebView webview) {
// We're done injecting data. Tell the webview we're finished if needed.
webview.loadUrl("javascript:document.write('\\n\\n');");
webview.loadUrl("javascript:document.close();");
}
成功地将标记流式传输到webview,并且页面正确显示,但我的文件:/// android_asset数据请求所有拒绝访问。将document.write
的基本URL更改为file:/// android_asset可修复这些问题,但会通过XmlHttpRequest中断对http://请求的访问。我假设这是专门针对通过loadDataWithBaseUrl
引入的内容的设计相同的原始政策。如果是这种情况,是否有另一种方法可以逐件注入这些内容?
简而言之,有没有办法重新实现document.write
和appendToWebView
或更改其他地方以将数据流式传输到网页视图,同时避免此访问问题?
答案 0 :(得分:0)
所以是的,混合http(s)和file:// scheme会因为相同的原始策略而中断。
这应该起作用:
编辑:WebView用于处理file:// android_asset URL的相关代码位是here。