4

我有 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;
    }
}

问题是在 Lollipop+ 上这两种方法都被调用了。所以我认为我应该指定不推荐使用的版本应该只用于旧的 Android 版本。与 RequiresApi 完全相反...如果可以通过制作复制粘贴类和使用 if-else 根据 Android 版本选择类来解决这个问题...但这真的很难看。

更新。更新以更好地反映问题。

4

1 回答 1

6

Android 源代码中 WebViewClient的默认实现从较新的版本调用已弃用shouldInterceptRequest的版本,将当前 URLrequest作为字符串传递:

@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 特定处理程序(使用super.shouldInterceptRequest(view, request)whenrequest为 null),因此它反过来调用已弃用处理程序的覆盖实现。

您不应super从新实现中调用该方法,以消除不推荐的方法执行。

于 2017-03-17T10:47:57.367 回答