Android WebView使用loadDataWithBaseURL加载的文档导入其他脚本,但它们没有运行

时间:2014-05-16 19:50:45

标签: javascript android webview android-webview

问题:

  • 对于Android WebView,我需要从CDN下载的html doc。
  • 我需要定期重新下载文档以查看是否存在 更新。
  • 我希望WebView加载此文档,但只加载一个 如果它与当前版本不同,则保留新版本 页面变量(我对文档没有影响,也无法更改 它的运行方式)。

我的解决方案是使用HttpURLConnection本地加载文档并使用webView.loadDataWithBaseURL(...)。这样我可以区分文档版本,只有在有新文档时才调用此方法。此外,此文档可以使用baseUrl获取其他资源。

webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient(){ /*...*/ });
webView.setWebViewClient(new WebViewClient(){ /*...*/ });
String html = getHtmlDoc("http://somecdn.com/doc.html");
webView.loadDataWithBaseURL("http://somecdn.com/", html, "text/html", "utf-8", null);

出乎意料的行为:

D/Console(xxxx): onPageStarted:http://somecdn.com/doc.html
D/Console(xxxx): onLoadResource:http://somecdn.com/script.js
D/Console(xxxx): onPageFinished:http://somecdn.com/doc.html

但是当我打电话时:

webView.loadUrl("javascript:console.log(typeof some_object)");

如果在script.js中定义some_object,则会打印以下内容:

D/Console(xxxx): undefined

WebViewClient.onReceivedError(...)没有报告任何错误。我错过了什么?只有在有新版本的情况下才有更好的加载doc.html的方法吗?我没有在下载内容之外访问CDN。我目前正在测试Android 4.1.1,但需要支持FROYO-KITKAT +

编辑:

解决方案:

根据marcin.kosiba的建议,我将使用指定If-Modified-Since的HEAD请求:

SimpleDateFormat ifModifiedFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
ifModifiedFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

final HttpURLConnection conn = (HttpURLConnection)(new URL("http://somecdn.com/doc.html")).openConnection();
conn.setRequestMethod("HEAD");
conn.setRequestProperty("If-Modified-Since", ifModifiedFormat.format(new Date(/* last fetched date */)));
conn.setRequestProperty("Accept-Encoding", "*"); 
conn.connect();         

if(conn.getResponseCode() == 200) {
    webView.reload();
}

在Android中有bug个HEAD请求,其中EOFException被引发,添加conn.setRequestProperty("Accept-Encoding", "*");conn.setRequestProperty("Accept-Encoding", "");可解决此问题。

1 个答案:

答案 0 :(得分:0)

因为你需要在WebView中重新加载页面,而不是自己下载html,你可以问服务器它是否已经改变,是否要求webview重新加载它?请参阅此回答https://stackoverflow.com/a/1938603/2977376,了解如何使用If-Modified-Since询问服务器内容是否已更改。