android-在使用不推荐使用的版本时,对不推荐使用和不推荐使用的变体两次调用了shouldInterceptRequest
作者:互联网
我有webView覆盖shouldInterceptRequest方法:
@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;
}
}
问题是在棒棒糖上这两种方法都被调用了.因此,我认为我应该指定不赞成使用的版本仅应用于旧的Android版本.与RequiresApi完全相反
如果可以通过制作复制粘贴类并使用if-else根据Android版本选择类来解决问题,但这确实很丑.
更新.更新以更好地反映问题.
解决方法:
默认实现WebViewClient in Android source codes从较新的版本调用不赞成使用的shouldInterceptRequest版本,将请求中的当前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方法,以免执行不受欢迎的方法.
标签:android-webview,android-api-levels,android,android-min-sdk 来源: https://codeday.me/bug/20191026/1934324.html