Android 5.1三星J3 2016调用WebView.loadUrl报UnsupportedOperationException如何解决
异常触发原因
- 该问题是Android 5.1对应版本的系统WebView内核的已知bug:旧版
AwContents.loadUrl实现逻辑中,会主动修改传入的请求头Map,调用remove方法移除特定请求头字段。 - Kotlin中
mapOf()方法在仅传入1组键值对时,默认返回的是不可变的SingletonMap实例,该类型不支持remove等修改操作,触发UnsupportedOperationException。 - 只有搭载该版本WebView的设备(如你提到的Android 5.1三星Galaxy J3 2016)会触发此问题,高版本WebView已经修复了修改外部传入Map的逻辑,因此不会崩溃。
可行修复方案
- 方案1:传入可变Map实例(最稳妥,全版本兼容)
替换mapOf创建不可变Map的逻辑,改用可变的HashMap或者mutableMapOf创建请求头,示例代码:
也可以直接使用val extraHeaders = HashMap<String, String>().apply { put("Referer", "https://my.site.url") } webView.loadUrl(state.url, extraHeaders)mutableMapOf:val extraHeaders = mutableMapOf("Referer" to "https://my.site.url") webView.loadUrl(state.url, extraHeaders) - 方案2:针对低版本做兼容(可选)
如果不想修改全局的请求头创建逻辑,可以仅对Android 6.0以下系统传入可变Map副本。不过方案1的实现成本更低,没有额外副作用,更推荐使用。
内容的提问来源于stack exchange,提问作者Axbor Axrorov
相关产品推荐
相关产品推荐

