4

我正在使用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")了,它们都不起作用。

有人建议吗?

4

2 回答 2

5

虽然这有点晚了,但我提供以下内容。也许它可能会有所帮助。. .

您的问题没有具体提到在 中使用任何回调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任何新的或其他的都不会加载任何内容。(尝试解释:只是 的包装类,它反过来检测一个对象。是最后一个人 ,完成所有工作。通过浏览源代码和反射,您可以钻入该对象,如果您愿意这样做。 是一个,因此,正好有一个WebViewWebViewWebViewProviderWebViewCoreWebViewCoreWebViewCorestaticWebViewCore为您的整个应用程序。因此,如果您唯一的 WebViewCore 卡住了,那么WebView您的应用程序中的 no 将在此后工作。一旦它被卡住等待,例如,一个JSResult方法被调用,它会一直卡住,直到应用程序被销毁(即,即使暂停/恢复应用程序的效果为零)。即使直接调用destroy()WebViewCore通过反射获得的访问也是无效的。NB 调用destroy()the具有调用theWebView的副作用,但这也无济于事)。destroy()WebViewCore

所以,症状就是

  1. 你创建一个WebView
  2. 一些聪明的 JS 运行,可能调用alert()
  3. 您在覆盖方法中处理alert()onJsAlert
  4. 你没有打电话result.confirm()result.cancel()
  5. 你毁了WebView
  6. 此后,WebView您的应用程序中的 no 将加载任何内容。

好消息是,如果您确定通过调用适当的 JsResult 方法来“清除”您覆盖的任何回调中的事件,那么WebViewCore不会永久停止,您的应用程序会很高兴。

于 2013-03-26T12:57:10.723 回答
4

我认为除了重新新建一个 WebView 之外没有办法做到这一点。

于 2013-01-11T07:08:19.320 回答