首页 > 解决方案 > WebView.loadUrl 引发 UnsupportedOperationException

问题描述

此异常仅在 android 5.1(Samsung Galaxy J3 2016)中引发

日志:

Caused by java.lang.UnsupportedOperationException
    java.util.Collections$SingletonMap$1$1.remove (Collections.java:355)
    java.util.AbstractMap.remove (AbstractMap.java:397)
    org.chromium.android_webview.AwContents.loadUrl (AwContents.java:1594)
    org.chromium.android_webview.AwContents.loadUrl (AwContents.java:1458)
    com.android.webview.chromium.WebViewChromium.loadUrl (WebViewChromium.java:496)
    android.webkit.WebView.loadUrl (WebView.java:862)

我没有这个设备,我从 crashlytics 报告中收到大量此类异常。我的 WebView 设置如下:

settings.loadWithOverviewMode = true
settings.useWideViewPort = true
@SuppressLint("SetJavaScriptEnabled")
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
webViewClient = WebViewClient()

我正在加载带有额外标题的 URL:

val extraHeaders = mapOf("Referer" to "https://my.site.url")
webView.loadUrl(state.url, extraHeaders)

标签: android-webviewandroid-5.0-lollipop

解决方案


好的,我发现了一个问题:在 loadUrl 方法的 AwContents 的源代码中,您可以找到这样的块:

    final String REFERER = "referer";
    Map<String, String> extraHeaders = params.getExtraHeaders();
    if (extraHeaders != null) {
        for (String header : extraHeaders.keySet()) {
            if (REFERER.equals(header.toLowerCase(Locale.US))) {
                params.setReferrer(new Referrer(extraHeaders.remove(header), 1));
                params.setExtraHeaders(extraHeaders);
                break;
            }
        }
    }

有趣的是extraHeaders.remove(header)因为我正在创建不可变的地图,这导致抛出 UnsupportedOperationException。

做了这个改变:

val extraHeaders = mutableMapOf("Referer" to "https://my.site.url")

推荐阅读