虽然这有点晚了,但我提供以下内容。也许它可能会有所帮助。. .
您的问题没有具体提到在 中使用任何回调WebChromeClient
,但您确实提到了 JS,因此以下内容可能会有所帮助。在 SDK 级别 16 及以下,您可以使用回调而无需专门“清除”它们。但是,从 SDK 级别 17 开始,我观察到您必须采取行动来清除事件——特别是,如果您覆盖它alert()
,这当然会导致在onJSAlert()
您的事件中被触发。WebChromeClient
在我测试过的 SDK 级别 16 及以下的所有设备中,您可以愉快地忽略回调,一切都会按计划进行。
但是,您会注意到onJSAlert
,当被覆盖时,会在最后一个参数中传递一个JSResult
对象,因此:
boolean onJsAlert( WebView view, String url, String message, JsResult结果)
我观察到 JsResult 对象有两个公开的方法,因此:
公共方法
最终无效 取消()
Handle the result if the user cancelled the dialog.
最终无效 确认()
Handle a confirmation response from the user
假设在回调中返回true(表示回调消耗了 onJsAlert 事件),并假设您使用的是 SDK 16 或之前的版本,那么WebView.destroy()
将执行预期的操作。
但是,我观察到 SDK 17 (4.2.x) 似乎需要进一步证明回调确实处理了事件。未能调用result.cancel()
or result.confirm()
,将使您的WebView
(或者,更重要的是,WebViewCore
)永久卡住。我尝试过的任何事情都不会重新唤醒,并且此后,WebViewCore
任何新的或其他的都不会加载任何内容。(尝试解释:只是 的包装类,它反过来检测一个对象。是最后一个人 ,完成所有工作。通过浏览源代码和反射,您可以钻入该对象,如果您愿意这样做。 是一个,因此,正好有一个WebView
WebView
WebViewProvider
WebViewCore
WebViewCore
WebViewCore
static
WebViewCore
为您的整个应用程序。因此,如果您唯一的 WebViewCore 卡住了,那么WebView
您的应用程序中的 no 将在此后工作。一旦它被卡住等待,例如,一个JSResult
方法被调用,它会一直卡住,直到应用程序被销毁(即,即使暂停/恢复应用程序的效果为零)。即使直接调用destroy()
,WebViewCore
通过反射获得的访问也是无效的。NB 调用destroy()
the具有调用theWebView
的副作用,但这也无济于事)。destroy()
WebViewCore
所以,症状就是
- 你创建一个
WebView
- 一些聪明的 JS 运行,可能调用alert()
- 您在覆盖方法中处理alert()
onJsAlert
- 你没有打电话
result.confirm()
或result.cancel()
- 你毁了
WebView
- 此后,
WebView
您的应用程序中的 no 将加载任何内容。
好消息是,如果您确定通过调用适当的 JsResult 方法来“清除”您覆盖的任何回调中的事件,那么WebViewCore
不会永久停止,您的应用程序会很高兴。