Android Webview EvaluateJavascript 有时不返回响应

问题描述 投票:0回答:3

我几周来一直试图解决这个问题,但不知道是什么导致了这个问题。在我的项目中,我使用 Android Webview 的

evaluateJavascript()
方法,如下所示:

    this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            webView.evaluateJavascript(command, new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    //Parsing and taking action here
                    Log.d("Response", value);
                }
            });
        }
    });

我发送的 javascript 示例字符串是:

document.getElementById("message").value="Stuff worked!"; 

document.getElementById("some-awesome-button").click(); 

虽然这些调用十分之九会在

onReceiveValue()
方法中返回一个值,但有时我根本就没有收到任何响应。

缺乏回应使得连锁事件成为一场噩梦,我不知道为什么会发生这种情况。

更多数据以避免任何其他问题:

  • 这个项目的最低 SDK 是 21,我的目标是 28。
  • 我目前使用任何
    javascriptInterface
    ,并且由于一些与业务相关的原因,不打算用于此项目。
  • 当我在
    onReceiveValue()
    方法中收到来自 webview 的响应时,它通常是我刚刚设置的值,如果是点击事件,则为“null”。无论如何,问题不在于我有时会收到空值或其他值,而是有时明显缺乏响应。
  • 如代码示例所示,我肯定按照文档在 UI 线程上运行它。
  • 每当我按下按钮时,我都会让服务器开发人员在控制台日志中添加一些代码,当我在
    onReceiveValue()
    方法中返回成功值时,控制台日志正在工作并响应,但是当我处于这种情况时没有得到响应,Web 控制台日志永远不会触发,也永远不会检测到与按钮的交互。
  • 我还尝试添加一个带有逻辑的计时器,用于监听来自 webview 的响应,如果没有收到响应,则尝试再次进行相同的调用,最多可达 10 倍。当第一次调用失败时,后续尝试都不起作用。
  • 这些是我的网络视图的设置:
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setAllowFileAccess(true);

问题似乎出在 Javascript Bridge 上,但我不能确定。

我的总结问题是,什么可能导致 Android WebView 的

evaluateJavascript()
调用不触发回调,也不在
onReceiveValue()
方法中返回值?

java android callback android-webview android-webview-javascript
3个回答
3
投票

发生在我身上,因为我试图从后台线程调用

webView.evaluateJavascript(...)

我通过使用 View#post() 包装它来解决它:

webView.post(() -> webView.evaluateJavascript(...));

0
投票

我最终明白了这里发生了什么。

更短的版本是,当出现内存泄漏并且正在使用半破坏的 Web 视图的对象将触发命令时,可能会发生这种情况,但新初始化的 Web 视图将不会收到响应,因为它将发送给死监听器。

如果您想防止这种情况发生,只需确保在活动重新启动时正确处置或正确重置所有维护

application Context
的对象,否则您将拥有使用相同应用程序级上下文的所有对象,但完全使用新的视图和回调。


0
投票

我也遇到了同样的问题,是的,很难调试。至少在我的例子中,事实证明,创建多个 WebView 突然导致评估Javascript(用 addJavascriptInterface 添加)停止回调。现在,我创建一个 WebView 实例,并在需要时传递它,然后替换 webViewClient(用于新的 onPageFinished)。

© www.soinside.com 2019 - 2024. All rights reserved.