问题:
我的解决方案是使用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)");
如果some_object是在script.js中定义的,则打印以下内容:
D/Console(xxxx): undefined
WebViewClient.onReceivedError(.)没有报告错误。我遗漏了什么?只有在有新版本时,才有更好的方法加载doc.html吗?除了下载内容之外,我没有任何访问CDN的权限。我目前正在Android 4.1.1上进行测试,但需要支持FROYO-KITKAT+
编辑:
解决方案:
按照marcin.kosiba的建议,我将使用指定为 If-Modified-Since 的HEAD请求:
If-Modified-Since
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 */)));