我在使用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!