android - shouldInterceptRequest 在使用非弃用时为弃用和非弃用变体调用两次

标签 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 版本选择类来解决这个问题……但这真的很难看。

更新。已更新以更好地反射(reflect)问题。

最佳答案

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 时使用 super.shouldInterceptRequest(view, request)为 null),它会依次调用已弃用处理程序的重写实现。

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

关于android - shouldInterceptRequest 在使用非弃用时为弃用和非弃用变体调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42804545/

相关文章:

android - 如何检查两个Android Binder 代理对象是否相等?

android - 带 DefaultRequest 2.X+ 的 Ktor 参数

android - 当针对目标 API 级别 29 进行编译时,能否在 Android API 级别 < 24 上访问 NMEA?

android - 低于 API 21 的 Kotlin 范围

android - 错误 :(280, 61) 找不到错误 : cannot access zza class file for com. google.android.gms.common.internal.safeparcel.zza

java - 指定的 minCompileSdk (31)

java - 使用 include 标签时键盘下一个按钮

android - WebView 未加载 ViewPager

android - 如何获取webView的url

javascript - 如何在 HTML 中找到行与行之间的空格?