我在使用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的任何人有用,则太大而无法在此问题中发布。但是让我知道它是否可以帮助诊断!
答案 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?