我正在使用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");
Run Code Online (Sandbox Code Playgroud)
代码第一次运行正常,但运行多次时失败.因为HTML找不到我的JS.
我认为因为之前的HTML并不完全清楚,所以mWebView.loadUrl("javascript:MyJsCode")将MyJsCode注入以前的HTML而不是新的HTML.
所以我想如果我能完全重置WebView(to clear the previous HTML),将解决我的问题.
我试过WebView.ClearView(), loadUrl("about:blank"),他们都不行.
有人建议吗?
虽然这有点晚了,但我提供以下内容.也许它可能会有所帮助...
你的问题没有特别提及使用中的任何回调WebChromeClient,但你确实提到了JS,所以以下内容可能有所帮助.在SDK级别16及以下版本中,您可以使用回调而无需专门"清除"它们.但是,从SDK级别17开始,我发现你必须采取行动来清除事件 - 特别是alert(),如果你覆盖事件,这当然会导致onJSAlert()你被触发WebChromeClient.在我在SDK级别16及以下测试的所有设备中,您可能会轻率地忽略回调,并且所有设备都将进行计划.
但是,您会注意到onJSAlert,当重写时,JSResult在最后一个参数中传递一个对象,因此:
boolean onJsAlert(WebView视图,String url,String消息,JsResult结果)
我观察到JsResult对象有两个暴露的方法,因此:
公共方法
final void cancel()
Run Code Online (Sandbox Code Playgroud)Handle the result if the user cancelled the dialog.最终无效 确认()
Run Code Online (Sandbox Code Playgroud)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,因此,恰好有一个WebViewCore对整个应用程序的.人体工程学,如果你的一个且仅WebViewCore卡住,没有WebView在你的应用程序将随后运行.一旦被卡住等待中,例如,对于一个JSResult要被调用的方法,它会被卡住,直到应用程序被破坏(即,甚至暂停/恢复应用具有零效果),即使呼叫destroy()的上WebViewCore直接,通过访问通过反射获得是无效的.NB调用destroy()上在WebView有呼叫的副作用destroy()的WebViewCore,但是这件事情,什么都不做有用).
所以,症状就是这样
WebViewonJsAlertresult.confirm()或result.cancel()WebViewWebView您的应用程序中没有任何内容会加载.好消息是,如果您确定通过调用适当的JsResult方法"清除"您覆盖的任何回调中的事件,那么WebViewCore将不会永久停止,您的应用程序将会很高兴.
| 归档时间: |
|
| 查看次数: |
5285 次 |
| 最近记录: |