如何在加载新请求之前完全重置Android webview

时间:2012-12-29 04:23:31

标签: android webview

我正在使用 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"),但他们都没有工作。

有人建议吗?

2 个答案:

答案 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()将执行预期的东西。

但是,我观察到,SDK 17(4.2.x)似乎需要进一步证明回调在处理事件时所做的进一步证明。如果没有致电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的副作用,但这也没有任何帮助。

所以,症状是那个

  1. 您创建了destroy()
  2. 一些聪明的JS运行,可能会调用 alert()
  3. 您在WebViewCore覆盖方法
  4. 中处理 alert()
  5. 您未能拨打WebViewonJsAlert
  6. 你销毁result.confirm()
  7. 此后,您的应用程序中没有result.cancel()将加载任何内容。
  8. 好消息是,如果您确定通过调用适当的JsResult方法“清除”您覆盖的任何回调中的事件,那么WebView将不会永久停止,您的应用程序将会很高兴。< / p>

答案 1 :(得分:2)

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