shouldInterceptRequest 在使用非弃用时为弃用和非弃用变体调用两次
shouldInterceptRequest called twice for deprecated and non deprecated variant when using non deprecated
我有覆盖 shouldInterceptRequest 方法的 webView:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
WebResourceResponse response = proxy.getWebResourceResponse(request.getUrl(), request.getMethod(), request.getRequestHeaders());
if (response == null) {
return super.shouldInterceptRequest(view, request);
} else {
return response;
}
}
@SuppressWarnings("deprecation")
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
WebResourceResponse response = proxy.getWebResourceResponse(Uri.parse(url), "GET", null);
if (response == null) {
return super.shouldInterceptRequest(view, url);
} else {
return response;
}
}
问题是 Lollipop+ 两个 方法都被调用了。所以我认为我应该指定不推荐使用的版本应该只用于旧的 Android 版本。与 RequiresApi 完全相反...
如果原因可以通过制作复制粘贴 classes 并使用 if-else 根据 Android 版本选择 class 来解决...但这真的很难看。
更新。已更新以更好地反映问题。
WebViewClient in Android source codes 的默认实现从较新的 shouldInterceptRequest
调用已弃用的版本,将 request
中的当前 URL 作为字符串传递:
@Deprecated
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
return null;
}
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
{
return shouldInterceptRequest(view, request.getUrl().toString());
}
由于您从自定义 WebViewClient
实现中调用默认的 Lollipop 特定处理程序(当 request
为 null 时使用 super.shouldInterceptRequest(view, request)
),它会依次调用您重写的实现已弃用的处理程序。
您不应从新实现中调用 super
方法以消除已弃用的方法执行。
我有覆盖 shouldInterceptRequest 方法的 webView:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
WebResourceResponse response = proxy.getWebResourceResponse(request.getUrl(), request.getMethod(), request.getRequestHeaders());
if (response == null) {
return super.shouldInterceptRequest(view, request);
} else {
return response;
}
}
@SuppressWarnings("deprecation")
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
WebResourceResponse response = proxy.getWebResourceResponse(Uri.parse(url), "GET", null);
if (response == null) {
return super.shouldInterceptRequest(view, url);
} else {
return response;
}
}
问题是 Lollipop+ 两个 方法都被调用了。所以我认为我应该指定不推荐使用的版本应该只用于旧的 Android 版本。与 RequiresApi 完全相反... 如果原因可以通过制作复制粘贴 classes 并使用 if-else 根据 Android 版本选择 class 来解决...但这真的很难看。
更新。已更新以更好地反映问题。
WebViewClient in Android source codes 的默认实现从较新的 shouldInterceptRequest
调用已弃用的版本,将 request
中的当前 URL 作为字符串传递:
@Deprecated
public WebResourceResponse shouldInterceptRequest(WebView view, String url)
{
return null;
}
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
{
return shouldInterceptRequest(view, request.getUrl().toString());
}
由于您从自定义 WebViewClient
实现中调用默认的 Lollipop 特定处理程序(当 request
为 null 时使用 super.shouldInterceptRequest(view, request)
),它会依次调用您重写的实现已弃用的处理程序。
您不应从新实现中调用 super
方法以消除已弃用的方法执行。