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

时间:2018-07-16 09:06:13

标签: android webview chromium intercept

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

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

如果我仅覆盖shouldOverrideUrlLoading但覆盖(如Android Studio自动完成的操作),则我的WebView加载并显示为完全正常:

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

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

  

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

之后

  

A / libc:致命信号6(SIGABRT),代码-6(SI_TKILL)在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的任何人有用,则太大而无法在此问题中发布。但是让我知道它是否可以帮助诊断!

2 个答案:

答案 0 :(得分:3)

我在我的案子中发现了这个问题,所以我想将它发布在这里给其他类似职位的人。

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

WebView在后台线程中运行JavaScript,因此任何与UI线程相关的事情都会使其在本机级别崩溃。给出上面非常无用的崩溃。

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!

答案 1 :(得分:0)

如果您正在编写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?