android WebViewClient.shouldOverrideUrlLoading()文档说明

unftdfkk  于 2023-05-15  发布在  Android
关注(0)|答案(1)|浏览(180)

参考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加载吗?

lymnna71

lymnna711#

基于WebView文档的处理自定义URL部分
只要URL是符合RFC 3986的有效URL,您的方法就不太可能直接中断正常URL。
shouldOverrideUrlLoading内部调用loadURL的主要问题是,它会使您的应用效率低下,并导致过多的Web流量(在大多数情况下,如果您实际上没有修改URL或基于某种自定义输入格式调用不同的网页,那么这是不必要的。
换句话说,“如果您不更改shouldOverrideUrlLoading中的URL,那么就不要再调用loadURL
基本上,当你不需要的时候,你会调用一个Web请求两次。
在从shouldOverrideUrlLoading返回true方面,示例列出了一种情况,即它们返回true,因为需要修改输入URL,因为它们使用的是自定义格式,需要以不同的方式处理。

// The URL scheme should be non-hierarchical (no trailing slashes)
private static final String APP_SCHEME = "example-app:";

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith(APP_SCHEME)) {
        urlData = URLDecoder.decode(url.substring(APP_SCHEME.length()), "UTF-8");
        respondToData(urlData);
        return true;
    }
    return false;
}

在上面的示例中,它们只是覆盖了行为,因为它们使用了自定义格式:<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

相关问题