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

带有shouldInterceptRequest覆盖的Android WebView即时崩溃,android,webview,chromium,intercept,Android,Webview,Chromium,Intercept,我在安卓网络视图上玩得很开心 我使用它来显示登录屏幕,然后在响应时截获验证代码。应该很简单 如果我只覆盖shouldOverrideUrlLoading,但如果我覆盖(就像Android Studio自动完成一样),则我的WebView加载和显示绝对良好: 在没有其他更改的情况下,它会在运行时立即崩溃,并出现本机崩溃 A/chromiu:[致命:jni_android.cc(259)] 接 A/libc:tid 16220(任务调度程序)中的致命信号6(SIGABRT),代码-6(SI_TKIL

我在安卓网络视图上玩得很开心

我使用它来显示登录屏幕,然后在响应时截获验证代码。应该很简单

如果我只覆盖shouldOverrideUrlLoading,但如果我覆盖(就像Android Studio自动完成一样),则我的WebView加载和显示绝对良好:

在没有其他更改的情况下,它会在运行时立即崩溃,并出现本机崩溃

A/chromiu:[致命:jni_android.cc(259)]

A/libc:tid 16220(任务调度程序)中的致命信号6(SIGABRT),代码-6(SI_TKILL),pid 16175(内部报告)

奇怪的是,如果我将响应设为null,WebView将再次工作。然而,在shoulInterceptRequest方法中添加任何其他内容都会导致同样的错误

所以这是可行的:

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()

不幸的是,在activity/fragments onDestroy/onDestroyView中,这没有帮助

在设备和模拟器以及Android sdk 22和28上的行为是相同的

以前有人见过这样的东西吗?我觉得我可能错过了一些明显的东西


如果它对任何人都有用,我也会生成Breakpad微转储,它太大了,无法在这个问题中发布。但是让我知道它,或者它的一个子集,是否有助于诊断

我在我的案例中发现了这个问题,所以我想我会把它贴在这里,以供其他类似职位的人使用

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

WebView在后台线程中运行JavaScript,因此任何涉及UI线程的操作都会导致它在本机级别上崩溃。在上面给出了一个毫无帮助的碰撞

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

解决方案是什么

科特林:

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


不要在重写的方法中触碰UIThread

如果您正在编写Kotlin代码来实现
WebViewClient
,您应该查看此答案并检查Kotlin重写的方法签名

我遇到了相同的运行时异常,并发现导致此问题的原因是Kotlin编译器未将互操作Java方法的返回类型转换为Kotlin方法的返回类型

Java代码的方法签名:

    public WebResourceResponse shouldInterceptRequest(WebView view, String url)
通过覆盖方法自动完成与Kotlin的互操作,如下所示:

    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse

Kotlin方法返回类型丢失

您需要做的是将
添加到
WebResourceResponse
,例如

    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse?

这也发生在我身上。希望我能说我知道发生了什么事。在我的例子中,我只是记录了url。如果我试图记录urli,那么这两种方法,一种是带有字符串的方法,另一种是带有web资源的方法,都会导致这种情况。我只是覆盖了shoulInterceptRequest方法,没有做任何操作,也没有做任何错误日志
    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse
    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse?