Android Webview EvaluateJavascript有时不返回响应

时间:2019-08-16 16:52:01

标签: java android callback android-webview android-webview-javascript

我已经尝试修复了好几个星期,不知道是什么导致了问题。在我的项目中,我正在使用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(); 

尽管这些调用在10次中有9次在onReceiveValue()方法中返回了一个值,但有时我只是从不接受任何响应。

这种缺乏响应的方式使链接事件变成了噩梦,我不知道为什么会发生这种情况。

更多数据可以解决任何其他问题:

  • 此项目的最低SDK为21,而我的目标是28。
  • 我目前目前未使用任何javascriptInterface,并且由于一些与业务相关的原因,我不打算参与该项目。
  • 当我在onReceiveValue()方法中获得来自Web视图的响应时,通常是我刚刚设置的值,如果它是单击事件,则通常为'null'。无论如何,问题不是我有时候会收到null或其他值,而是有时有时缺少响应。
  • 如代码示例所示,我绝对按照文档在UI Thread上运行此代码。
  • 每当我按下按钮时,我都会让服务器开发人员在控制台日志中添加一些代码,并且当我在onReceiveValue()方法中获得成功的值时,控制台日志会运行并响应,但是当我进入在我没有回复响应的情况下,Web控制台日志从不触发,也从未检测到与按钮的交互。
  • 我还尝试添加带有逻辑的计时器,该逻辑侦听来自webview的响应,如果未收到响应,则尝试再次进行相同的调用,最多可达10倍。当第一个呼叫失败时,随后的尝试均无效。
  • 这些是我的网络视图的设置:
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setAllowFileAccess(true);

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

我的总结性问题是,什么会导致Android WebView的evaluateJavascript()调用不触发回调或不返回onReceiveValue()方法中的值?

2 个答案:

答案 0 :(得分:0)

我最终弄清楚了这里发生了什么。

较短的版本是,当您发生内存泄漏,并且正在使用半破坏的webview的对象将触发命令,但是新初始化的webview将不会收到响应,则可能会发生这种情况。死听者。

如果要防止这种情况发生,只需确保维护了application Context的所有对象都已被正确处置或在活动重新启动时正确重置,否则所有对象都使用相同的应用程序级别上下文,但完全使用新的视图和回调。

答案 1 :(得分:0)

发生这种情况是因为我试图从后台线程调用webView.evaluateJavascript(...)

我通过使用View#post()包装它来解决了这个问题:

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