如何在不破坏对http://或file:/// android_asset的访问权限的情况下将标记数据流式传输到Android webview中?

时间:2014-11-25 17:59:18

标签: android html webview android-webview

后台:我有一个工作的应用程序,它通过读取HttpURLConnection的响应来填充webview数据,对标记运行一些处理,然后将完整的字符串提供给{{1显示页面。这种方法有效,但是具有消除部分加载文档的并发处理的性能缺点,默认情况下,在任何浏览器或webview中正常加载页面时都会发生。

目标:我想将我的应用程序更改为流式传输模型而不是两步串行流程。简而言之,我正在调查我是否可以摆脱这个:

  1. 从服务器打开响应流。
  2. 阻止并阅读从服务器到文档末尾的所有内容。
  3. 立刻将整个内容交给webview。
  4. 到此:

    1. 从服务器打开响应流。
    2. 阅读所有可用数据并立即将其交给网页浏览。
    3. 重复2直到文档结束。
    4. 对于额外的皱纹,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.writeappendToWebView或更改其他地方以将数据流式传输到网页视图,同时避免此访问问题?

1 个答案:

答案 0 :(得分:0)

所以是的,混合http(s)和file:// scheme会因为相同的原始策略而中断。

这应该起作用:

  • 将您的全部内容托管在“虚拟”http(s)网址下(最好是您拥有的网址,或使用androidplatform.net),
  • 使用WebViewClient.shouldInterceptRequest拦截对“虚拟”URL的请求,并提供网络InputStream或与资产关联的InputStream。

编辑:WebView用于处理file:// android_asset URL的相关代码位是here