android-webview - 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)
解决方案
好的,我发现了一个问题:在 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")
推荐阅读
- android - 无引用复制ArrayList对象快速解决方案
- javascript - 如何发送列表对象而不是单个对象
- continuous-integration - gocd - 代理从不做第二个管道阶段/工作
- python - 使用决策树的自定义数据预测
- flask - 如何使用 Zappa 在单个域下创建多个版本化 API?
- python - python代码从列表中删除元素的重复项或子字符串
- python - 我的模型的训练/验证准确性表现奇怪
- powershell - 将字符添加到每行的 Out-File 内容?
- spring - 如何在没有 WebAppConfiguration 的集成测试中模拟 Spring 会话
- mule - DataWeave 1.0 - Mulesoft 查询