Android Webview EvaluateJavascript 有时没有return 响应
Android Webview EvaluateJavascript sometimes does not return a response
几周来我一直在尝试解决这个问题,但不知道是什么导致了这个问题。在我的项目中,我正在使用 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 次这些调用 return onReceiveValue()
方法中的一个值,但偶尔我只是直接根本没有收到任何响应。
缺乏响应使事件链接成为一场噩梦,我不知道为什么会发生这种情况。
一些更多的数据来阻止任何其他问题:
- 这个项目的最低 SDK 是 21,我的目标是 28。
- 目前我没有使用任何
javascriptInterface
,并且出于一些与业务相关的原因不打算使用此项目。
- 当我在
onReceiveValue()
方法中收到来自 webview 的响应时,它通常是我刚刚设置的值,或者 'null' 如果它是点击事件。无论如何,问题不是我有时会收到空值或其他值,而是明显缺乏响应有时。
- 如代码示例所示,根据文档,我在 UI 线程上肯定是 运行 这个。
- 我让服务器开发人员在我按下按钮时将一些代码添加到控制台日志中,当我在
onReceiveValue()
方法中返回一个成功的值时,控制台日志正在工作并响应但是当我在我没有得到响应的情况下,Web 控制台日志永远不会触发,也永远不会检测到与按钮的交互。
- 我还尝试添加一个计时器,该计时器具有侦听来自 webview 的响应的逻辑,如果它没有收到响应,则尝试再次进行相同的调用,最多 10 次。当第一次调用失败时,none 次后续尝试都会成功。
- 这些是我的网络视图的设置:
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAllowFileAccess(true);
问题似乎出在 Javascript 桥上,但我不能确定。
我的总结性问题是,什么会导致 Android WebView 的 evaluateJavascript()
调用不触发回调,也不 return [=] 中的值17=]方法?
我终于弄清楚这里发生了什么。
更短的版本是,当您有内存泄漏并且使用半毁坏的 webview 的对象将触发命令时,可能会发生这种情况,但新初始化的 webview 不会收到响应,因为它正在运行一个死去的听众。
如果你想防止这种情况发生,只需确保维护 application Context
的所有对象都被正确处理或在 activity 重新启动时正确重置,否则你拥有所有对象使用相同的应用程序级上下文,但完全使用新的视图和回调。
发生在我身上,因为我试图从后台线程调用 webView.evaluateJavascript(...)
。
我通过使用 View#post() 包装解决了它:
webView.post(() -> webView.evaluateJavascript(...));
几周来我一直在尝试解决这个问题,但不知道是什么导致了这个问题。在我的项目中,我正在使用 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 次这些调用 return onReceiveValue()
方法中的一个值,但偶尔我只是直接根本没有收到任何响应。
缺乏响应使事件链接成为一场噩梦,我不知道为什么会发生这种情况。
一些更多的数据来阻止任何其他问题:
- 这个项目的最低 SDK 是 21,我的目标是 28。
- 目前我没有使用任何
javascriptInterface
,并且出于一些与业务相关的原因不打算使用此项目。 - 当我在
onReceiveValue()
方法中收到来自 webview 的响应时,它通常是我刚刚设置的值,或者 'null' 如果它是点击事件。无论如何,问题不是我有时会收到空值或其他值,而是明显缺乏响应有时。 - 如代码示例所示,根据文档,我在 UI 线程上肯定是 运行 这个。
- 我让服务器开发人员在我按下按钮时将一些代码添加到控制台日志中,当我在
onReceiveValue()
方法中返回一个成功的值时,控制台日志正在工作并响应但是当我在我没有得到响应的情况下,Web 控制台日志永远不会触发,也永远不会检测到与按钮的交互。 - 我还尝试添加一个计时器,该计时器具有侦听来自 webview 的响应的逻辑,如果它没有收到响应,则尝试再次进行相同的调用,最多 10 次。当第一次调用失败时,none 次后续尝试都会成功。
- 这些是我的网络视图的设置:
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setAllowFileAccess(true);
问题似乎出在 Javascript 桥上,但我不能确定。
我的总结性问题是,什么会导致 Android WebView 的 evaluateJavascript()
调用不触发回调,也不 return [=] 中的值17=]方法?
我终于弄清楚这里发生了什么。
更短的版本是,当您有内存泄漏并且使用半毁坏的 webview 的对象将触发命令时,可能会发生这种情况,但新初始化的 webview 不会收到响应,因为它正在运行一个死去的听众。
如果你想防止这种情况发生,只需确保维护 application Context
的所有对象都被正确处理或在 activity 重新启动时正确重置,否则你拥有所有对象使用相同的应用程序级上下文,但完全使用新的视图和回调。
发生在我身上,因为我试图从后台线程调用 webView.evaluateJavascript(...)
。
我通过使用 View#post() 包装解决了它:
webView.post(() -> webView.evaluateJavascript(...));