Android webview的loadData和loadDataWithBaseURL有什么区别?

7
Android的Webview有两种加载数据的方法。
public void loadData (String data, String mimeType, String encoding)

请注意,JavaScript的同源策略意味着使用该方法加载的页面中运行的脚本将无法访问使用任何方案(包括“http(s)”)加载的内容,除了“data”。为避免此限制,请使用带有适当基础URL的loadDataWithBaseURL()。
public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)

请注意,以这种方式指定的内容只能访问本地设备文件(通过“file”方案URL),前提是baseUrl指定的方案不是“http”,“https”,“ftp”,“ftps”,“about”或“javascript”之一。
我不知道这两个句子的意思,什么情况下应该选择其中之一?
谢谢。

我一直在想,setWebViewClient 有什么区别? - Fattie
3个回答

12
public void loadData (String data, String mimeType, String encoding)
在这里我们传递HTML、mimeType和编码信息。
另外在哪里呢?
public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)

baseUrl指的是基础URL,可以是路径到资源文件夹、SD卡或其他路径,与HTML相关的图像或其他媒体所在的位置,我对historyUrl并不太了解。

根据[loadData][1]的文档

请注意,JavaScript的同源策略意味着使用此方法加载的页面中运行的脚本将无法访问除“data”以外的任何方案加载的内容,包括“http(s)”等。为避免此限制,请使用带有适当基础URL的loadDataWithBaseURL()

这意味着loadData仅包含第一个参数中存在的部分。

并且

请注意,以这种方式指定的内容只能访问本地设备文件(通过“file”方案URL),只有baseUrl指定的方案不是“http”,“https”,“ftp”,“ftps”,“about”或“javascript”,才能执行此操作。

以上简单意思是您可以通过传递baseUrl来访问来自http和其他来源的数据。

例如,如果我编写需要大量从我的ftp或其他地方获取的图像的HTML,我将在baseURl参数中传递我的ftp的URL,然后就可以访问我的图像了。


@Yamamoto 请考虑一下...http://en.wikipedia.org/wiki/File_URI_scheme,其中提到:用于从自己的计算机中检索文件。在我们的情况下,它是手机。 - Nixit Patel
在这个上下文中,“scheme”是什么意思? - onmyway133
请查看链接,它会很有帮助。 - Nixit Patel
这是否意味着在基本URL中使用null将允许我从不同的域访问JavaScript? - Pradeep
当我传递baseURL和设备上文件位置的路径(file://...)时,webview可以很好地访问内容,但不再响应文件中的任何链接或锚点。请看一下这个问题:https://dev59.com/qbXna4cB1Zd3GeqPH0Oi - coder

4

当您本地加载HTML并引用本地打包的图像和CSS等资产时,第二种方法非常有用。


1

loadDataWithBaseURL() 还支持 Unicode。这在您尝试加载与英语以外内容的网页时可能会有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接