Android Webview EvaluateJavascript有时不返回响应

Android Webview EvaluateJavascript有时不返回响应,java,android,callback,android-webview,android-webview-javascript,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&

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

虽然10次调用中有9次会在
onReceiveValue()
方法中返回一个值,但偶尔我根本不会收到响应

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

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

  • 这个项目的最低SDK是21,我的目标是28
  • 此时此刻,我不打算使用任何
    javascriptInterface
    s,出于一些与业务相关的原因,我不打算为这个项目提供任何帮助
  • 当我在
    onReceiveValue()
    方法中收到webview的响应时,它通常是我刚刚设置的值,如果是单击事件,则为“null”。不管怎样,问题不是我有时会收到空值或其他值,而是有时明显缺乏响应
  • 如代码示例所示,我肯定会按照文档在UI线程上运行它
  • 每当我按下按钮时,服务器开发人员就会在控制台日志中添加一些代码,当我在
    onReceiveValue()
    方法中成功返回值时,控制台日志会工作并响应,但当我处于无法返回响应的情况下,web控制台日志从未触发,也从未检测到与按钮的交互
  • 我还尝试添加一个带有逻辑的计时器,用于侦听来自webview的响应,如果它没有收到响应,则尝试再次进行相同的调用,最高可达10倍。当第一次调用失败时,后续的任何尝试都不起作用
  • 以下是my webview的设置:
似乎问题出在Javascript桥上,但我不能确定


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

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

较短的版本是,如果内存泄漏,并且使用半破坏webview的对象将触发命令,但新初始化的webview将不会收到响应,因为它将发送给死掉的侦听器,则可能会发生这种情况


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

发生在我身上,因为我试图从后台线程调用
webView.evaluateJavascript(…)

我通过以下方式解决了此问题:

document.getElementById("message").value="Stuff worked!"; 
document.getElementById("some-awesome-button").click(); 
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.getSettings().setAllowFileAccess(true);
webView.post(() -> webView.evaluateJavascript(...));