我正在使用 Android WebView 来加载一些网页。就我而言,我必须在加载的网页之前插入一些JavaScript代码。如下所示:
//enable javascript
mWebView.getSettings().setJavaScriptEnabled(true);
//inject my js first.
//I can't inject the js onPageStarted() or onPageFinished() because I need to make sure the js
//is injected before html loaded.
mWebView.loadUrl("javascript:MyJsCode");
//load HTML
mWebView.loadUrl("http://example.com/demos/index.html");
代码第一次运行正常,但运行多次时失败。因为HTML无法找到我的JS。
我认为因为以前的HTML并不完全清楚,所以mWebView.loadUrl("javascript:MyJsCode")
会将MyJsCode注入以前的HTML而不是新的HTML。
所以我想如果我能完全重置WebView(to clear the previous HTML)
,就会解决我的问题。
我尝试了WebView.ClearView(), loadUrl("about:blank")
,但他们都没有工作。
有人建议吗?
答案 0 :(得分:5)
虽然这有点晚了,但我提供以下内容。也许它可能会有所帮助。 。 。
您的问题没有特别提及使用WebChromeClient
中的任何回调,但您确实提到了JS,因此以下内容可能有所帮助。在SDK级别16及以下版本中,您可以使用回调而无需专门“清除”它们。但是,从SDK级别17开始,我发现您必须采取行动清除事件 - 特别是alert()
,当然,如果您在onJSAlert()
中导致WebChromeClient
被解雇覆盖它。在我在SDK级别16及以下测试的所有设备中,您可能会轻率地忽略回调,并且所有设备都将进行规划。
但是,您会注意到onJSAlert
在被覆盖时会在最后一个参数中提供JSResult
个对象,因此:
布尔 onJsAlert( WebView 视图,字符串网址,字符串消息, JsResult 结果)
我观察到JsResult对象暴露了两个方法,因此:
公共方法
最终无效取消()
Handle the result if the user cancelled the dialog.
最终无效确认()
Handle a confirmation response from the user
假设在回调中返回 true (表示回调消耗了onJsAlert事件),并假设您使用的是SDK 16或之前,那么WebView.destroy()
将执行预期的东西。
result.cancel()
或result.confirm()
,您的WebView
(或者更重要的是,WebViewCore
)将永久停留。我尝试过的任何内容都不会重新唤醒WebViewCore
,之后,任何WebView
,新或其他内容都不会加载任何内容。 (尝试解释:WebView
仅仅是WebViewProvider
的包装类,它反过来构成一个WebViewCore
对象。这是最后一个人,WebViewCore
,完成所有工作通过漫游源代码,并通过反射,你可以挖掘你的方式,如果你热衷于这样做。WebViewCore
是一个static
,因此,只有一个{{1}对于你的整个应用程序。问题,如果你的一个唯一的WebViewCore卡住了,你的应用程序中的WebViewCore
之后就不会工作了。一旦它等待,例如,{{1}要被调用的方法,它将被卡住,直到应用程序被销毁(即使暂停/恢复应用程序也没有效果)。甚至直接在WebView
上调用JSResult
,通过反射获得的访问权限是注意destroy()
上WebViewCore
的{{1}}调用destroy()
会产生WebView
的副作用,但这也没有任何帮助。
所以,症状是那个
destroy()
WebViewCore
覆盖方法WebView
或onJsAlert
result.confirm()
result.cancel()
将加载任何内容。好消息是,如果您确定通过调用适当的JsResult方法“清除”您覆盖的任何回调中的事件,那么WebView
将不会永久停止,您的应用程序将会很高兴。< / p>
答案 1 :(得分:2)
我认为除了重新创建WebView之外没有办法做到这一点。