我几周来一直试图解决这个问题,但不知道是什么导致了这个问题。在我的项目中,我使用 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()
方法中返回一个值,但有时我根本就没有收到任何响应。
缺乏回应使得连锁事件成为一场噩梦,我不知道为什么会发生这种情况。
更多数据以避免任何其他问题:
javascriptInterface
,并且由于一些与业务相关的原因,不打算用于此项目。 onReceiveValue()
方法中收到来自 webview 的响应时,它通常是我刚刚设置的值,如果是点击事件,则为“null”。无论如何,问题不在于我有时会收到空值或其他值,而是有时明显缺乏响应。 onReceiveValue()
方法中返回成功值时,控制台日志正在工作并响应,但是当我处于这种情况时没有得到响应,Web 控制台日志永远不会触发,也永远不会检测到与按钮的交互。 webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAllowFileAccess(true);
问题似乎出在 Javascript Bridge 上,但我不能确定。
我的总结问题是,什么可能导致 Android WebView 的
evaluateJavascript()
调用不触发回调,也不在 onReceiveValue()
方法中返回值?
发生在我身上,因为我试图从后台线程调用
webView.evaluateJavascript(...)
。
我通过使用 View#post() 包装它来解决它:
webView.post(() -> webView.evaluateJavascript(...));
我最终明白了这里发生了什么。
更短的版本是,当出现内存泄漏并且正在使用半破坏的 Web 视图的对象将触发命令时,可能会发生这种情况,但新初始化的 Web 视图将不会收到响应,因为它将发送给死监听器。
如果您想防止这种情况发生,只需确保在活动重新启动时正确处置或正确重置所有维护
application Context
的对象,否则您将拥有使用相同应用程序级上下文的所有对象,但完全使用新的视图和回调。
我也遇到了同样的问题,是的,很难调试。至少在我的例子中,事实证明,创建多个 WebView 突然导致评估Javascript(用 addJavascriptInterface 添加)停止回调。现在,我创建一个 WebView 实例,并在需要时传递它,然后替换 webViewClient(用于新的 onPageFinished)。