参考shouldOverrideUrlLoading的API级别**24+**only版本,文档中明确指出:
注意:不要用请求的URL调用WebView#loadUrl(String),然后返回true。这不必要地取消了当前的加载并使用相同的URL开始新的加载。继续加载给定URL的正确方法是简单地返回false,而不调用WebView#loadUrl(String)。
然而,在我的应用程序中,我必须在加载URL之前执行一些额外的活动,这些活动只能在MyWebView#loadUrl(String)中完成,因此我确实从MyWebViewClient#shouldOverrideUrlLoading
中调用MyWebView#loadUrl
,然后是return true;
。
这看起来很好,但我现在有一些疑问:
这个关于“继续加载给定URL的正确方法”的警告是否意味着如果我没有遵循它,这段代码可能会崩溃
- 在将来(如“使用未记录的内部API”)
- 还是用“不寻常的网站”来突破
在什么情况下(例如frames,iframes,301/302重定向)这个return true;
方案会破坏正确的URL加载吗?
1条答案
按热度按时间lymnna711#
基于WebView文档的处理自定义URL部分
只要URL是符合RFC 3986的有效URL,您的方法就不太可能直接中断正常URL。
在
shouldOverrideUrlLoading
内部调用loadURL
的主要问题是,它会使您的应用效率低下,并导致过多的Web流量(在大多数情况下,如果您实际上没有修改URL或基于某种自定义输入格式调用不同的网页,那么这是不必要的。换句话说,“如果您不更改
shouldOverrideUrlLoading
中的URL,那么就不要再调用loadURL
。基本上,当你不需要的时候,你会调用一个Web请求两次。
在从
shouldOverrideUrlLoading
返回true方面,示例列出了一种情况,即它们返回true
,因为需要修改输入URL,因为它们使用的是自定义格式,需要以不同的方式处理。在上面的示例中,它们只是覆盖了行为,因为它们使用了自定义格式:
<a href="example-app:showProfile">
所以应用程序说“这是一个奇怪的自定义开发者定义的格式,而不是一个正常的URL,所以应用程序应该使用这个自定义的
respondToData(urlData);
”使用WebView遇到的问题就像this question一样,您可以创建自己的自定义URL,除了WebView的实现需要一些不同的东西(即,基于Web标准的有效URL)
如果您使用的是自定义URL方案或基本URL,则这可能特别棘手,因为它不是符合RFC 3986的有效URL。在这些情况下,您可能无法正确触发
shouldOverrideUrlLoading()
回调。如果您不希望URI Normalization出现这种行为,也可能会遇到问题。
只要框架、iframe和/或301/302重定向表示有效的URL地址和格式,就不应该有问题。但是,在这些情况下,只要您没有在
shouldOverrideUrlLoading
中更改URL或对URL使用某种类型的自定义响应,那么就不需要再次调用WebView#loadURL
。