带有shouldInterceptRequest覆盖的Android WebView即时崩溃

我在使用Android WebView时遇到了一些“乐趣”.

我使用它来显示登录屏幕,然后在响应时拦截身份验证代码.应该很简单…

如果仅覆盖shouldOverrideUrlLoading但覆盖(就像Android Studio自动完成的那样),我的WebView就会加载并显示为绝对正常:

override fun shouldInterceptRequest(
    view: WebView?,
    request: WebResourceRequest?
): WebResourceResponse {
    return super.shouldInterceptRequest(view, request)
}

没有其他更改,它将在运行时立即崩溃,并发生本机崩溃

A/chromium: [FATAL:jni_android.cc(259)]

其次是

A/libc: Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 16220 (TaskSchedulerFo), pid 16175 (eports.internal)

奇怪的是,如果我使响应为空,则WebView可以再次工作.但是,将其他任何内容添加到shouldInterceptRequest方法中会使它掉落,并出现相同的错误.

所以这工作:

override fun shouldInterceptRequest(
    view: WebView?,
    request: WebResourceRequest?
): WebResourceResponse? {
    return super.shouldInterceptRequest(view, request)
}

但这会因上述崩溃而崩溃:

override fun shouldInterceptRequest(
    view: WebView?,
    request: WebResourceRequest?
): WebResourceResponse? {
    val url = view?.url
    return super.shouldInterceptRequest(view, request)
}

这似乎是一个很奇怪的问题,对我来说,为什么添加val分配根本没有任何区别是没有意义的.

我一直在研究错误,建议添加

webView.destroy()

在活动/片段onDestroy / onDestroyView中,不幸的是这没有帮助.

设备和仿真器以及Android SDK 22和28的行为相同.

有人看过这样的东西吗?我觉得我可能缺少明显的东西.

如果它也对生成了Breakpad Microdump的任何人有用,它太大了,无法在此问题中发布.但是,请告诉我它或其一部分可能有助于诊断!

解决方法:

我已找到问题所在,因此以为我会将其发布在这里给其他类似职位的人.

本机崩溃是由WebView中运行的JavaScript引起的.

WebView在后台线程中运行JavaScript,因此任何与UI线程相关的操作都将导致JavaScript在本机级别崩溃.给上面非常无用的崩溃.

val分配导致崩溃的原因不是分配val,而是调用UIThread上的if?view..url.

解决方案?

科特林:

webView?.post{
   // Do your UI work here.
}

Java:

webView.post(new Runnable(){
    public void run() {
    // Do your UI work here.
    }
})

并且不要在覆盖的方法内触摸UIThread!

上一篇:怎么查看ofd格式电子发票? 2种简单方法免费查看


下一篇:SpringBoot整合ElasticSearch实现多版本的兼容