我已经尝试修复了好几个星期,不知道是什么导致了问题。在我的项目中,我正在使用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()
方法中返回了一个值,但有时我只是从不接受任何响应。
这种缺乏响应的方式使链接事件变成了噩梦,我不知道为什么会发生这种情况。
更多数据可以解决任何其他问题:
javascriptInterface
,并且由于一些与业务相关的原因,我不打算参与该项目。 onReceiveValue()
方法中获得来自Web视图的响应时,通常是我刚刚设置的值,如果它是单击事件,则通常为'null'。无论如何,问题不是我有时候会收到null或其他值,而是有时有时缺少响应。 onReceiveValue()
方法中获得成功的值时,控制台日志会运行并响应,但是当我进入在我没有回复响应的情况下,Web控制台日志从不触发,也从未检测到与按钮的交互。 webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAllowFileAccess(true);
似乎问题出在Javascript Bridge,但我不确定。
我的总结性问题是,什么会导致Android WebView的evaluateJavascript()
调用不触发回调或不返回onReceiveValue()
方法中的值?
答案 0 :(得分:0)
我最终弄清楚了这里发生了什么。
较短的版本是,当您发生内存泄漏,并且正在使用半破坏的webview的对象将触发命令,但是新初始化的webview将不会收到响应,则可能会发生这种情况。死听者。
如果要防止这种情况发生,只需确保维护了application Context
的所有对象都已被正确处置或在活动重新启动时正确重置,否则所有对象都使用相同的应用程序级别上下文,但完全使用新的视图和回调。
答案 1 :(得分:0)
发生这种情况是因为我试图从后台线程调用webView.evaluateJavascript(...)
。
我通过使用View#post()包装它来解决了这个问题:
webView.post(() -> webView.evaluateJavascript(...));