在使用未弃用的

时间:2017-03-15 08:30:27

标签: android android-webview android-api-levels android-min-sdk

我有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版本选择类来解决原因......但这真的很难看。

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

1 个答案:

答案 0 :(得分:4)

WebViewClient in Android source codes的默认实现从较新版本调用已弃用的shouldInterceptRequest版本,将request中的当前网址作为字符串传递:

@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)为空时使用request),它会依次调用您已弃用的重写实现处理程序。

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