gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:21:40 27 4
gpt4 key购买 nike

我正在使用 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 注入(inject)到之前的 HTML 而不是新的 HTML。

所以我想如果我可以完全重置WebView(以清除以前的 HTML),将解决我的问题。

我尝试了 WebView.ClearView(), loadUrl("about:blank"),它们都不起作用。

有什么建议吗?

最佳答案

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

您的问题没有具体提及使用 WebChromeClient 中的任何回调,但您确实提到了 JS,因此以下内容可能会有所帮助。在 SDK 级别 16 及以下,您可以使用回调而无需特别“清除”它们。但是,从 SDK 级别 17 开始,我观察到您必须采取行动来清除事件——特别是 alert(),这当然会导致 onJSAlert() 被如果您覆盖它,则会在您的 WebChromeClient 中触发。在我测试过的所有 SDK 级别 16 及以下的设备中,您可以轻松地忽略回调,一切都会按计划进行。

但是,您会注意到 onJSAlert 在被覆盖时会在最后一个参数中传递一个 JSResult 对象,因此:

boolean onJsAlert(WebView view, String url, String message, JsResult result)

我观察到 JsResult 对象公开了两个方法,因此:

Public Methods

final void cancel()

Handle the result if the user cancelled the dialog.

最终作废 confirm()

Handle a confirmation response from the user

假设在回调中返回true(说明回调消费了onJsAlert事件),假设你使用的是16或之前的SDK,那么WebView.destroy() 将做预期的事情。

但是,我观察到 SDK 17 (4.2.x) 似乎需要进一步证明回调确实确实处理了事件。未能调用 result.cancel()result.confirm(),将离开您的 WebView(或者,更重要的是,WebViewCore) 永久卡住。我尝试过的任何操作都不会重新唤醒 WebViewCore,此后,不会在任何 WebViewnew 或其他地方加载任何内容。 (尝试解释:WebView 只是 WebViewProvider 的一个包装类,它反过来检测一个 WebViewCore 对象。是最后一个家伙,WebViewCore,它完成了所有工作。通过浏览源代码并通过反射,如果您愿意,您可以深入了解该对象。WebViewCore 是一个static,因此,整个应用程序只有一个 WebViewCore。因此,如果您的唯一 WebViewCore 卡住了,则没有 WebView in your application will work after there. 一旦它被卡住等待,例如,要调用 JSResult 方法,它将被卡住直到应用程序被销毁(即甚至暂停/恢复应用程序效果为零)。即使直接在 WebViewCore 上调用 destroy(),通过反射获得的访问权限也是无效的。注意调用 destroy()WebView 具有在 WebViewCore 上调用 destroy() 的副作用,但这也没有任何帮助。

所以,症状是

  1. 你创建了一个WebView
  2. 一些聪明的 JS 运行,也许调用 alert()
  3. 您在 onJsAlert 覆盖方法中处理 alert()
  4. 您未能调用 result.confirm()result.cancel()
  5. 你破坏了WebView
  6. 此后,您的应用程序中的任何 WebView 都不会加载任何内容。

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

关于android - 如何在加载新请求之前完全重置 Android webview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com