![](/img/trans.png)
[英]Android WebView.evaluateJavascript() and uncaught reference error
[英]How to return value from webView.evaluateJavascript callback?
所以我有一个名为JavascriptBridge的类,我用它在 Java 和 Javascript 之间进行通信。
要将命令发送到 javascript,我只需使用以下命令:
public void sendDataToJs(String command) {
webView.loadUrl("javascript:(function() { " + command + "})()");
}
我的问题是我还需要一个从 Javascript 返回响应的函数。 我尝试使用webView.evaluateJavascript ,但它跳过了回调,因为evaluateJavascript 是在另一个线程上完成的。
public String getDataFromJs(String command, WebView webView) {
String data = null;
webView.evaluateJavascript("(function() { return " + command + "; })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.d("LogName", s); // Print "test"
// data = s; // The value that I would like to return
}
});
return data; // Return null, not "test"
}
对方法的调用:
String result = getDataFromJs("test", webView); // Should return "test" from the webView
我也试过使用@JavascriptInterface ,但它给出了相同的结果。
没有办法在 Android 上同步评估 Javascript(即在当前线程上),所以最好的办法是使用evaluateJavascript
然后等待回调:
public void getDataFromJs(String command, WebView webView) {
webView.evaluateJavascript("(function() { return " + command + "; })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
returnDataFromJs(s);
}
});
}
public returnDataFromJs(String data) {
// Do something with the result.
}
没有一种方法可以在当前线程上评估 Javascript,因为 Javascript 操作可能需要一段时间(JS 引擎需要时间来启动)并且这可能会阻塞当前线程。
我在 Kotlin 中编写了一个小代码片段,可以帮助您。 我是用 RxKotlin 写的,但如果你使用 Java,你可以使用 RxJava2,因为它们是相同的。
fun getDataFromJsSync(command: String, webView: WebView): String {
return getDataFromJs(command, webView).blockingGet()
}
fun getDataFromJs(command: String, webView: WebView): Single<String> {
return Single.create { emitter: SingleEmitter<String> ->
try {
webView.evaluateJavascript(
"(function() { return $command; })();",
{ result -> emitter.onSuccess(result) }
)
} catch (e: Exception) {
emitter.onError(e)
}
}
}
PS 我还没有测试过这些函数,也不能保证它们可以工作,但我没有时间,我会测试它们并在我有时间的时候用 Java 重写它们,可能最多 5 小时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.