如何立即从 Android Java 调用 WebView Java 脚本中的函数?

How to call a function in WebView Javascript from Android Java without delay?

使用此方法调用 javascript 函数时,回调中有几毫秒的延迟(10 毫秒 - 50 毫秒)

 webView.evaluateJavascript("javascript: updateARObject()", callback);

如何在javascript中即时调用一个函数,所有文件都在Android的资产文件夹中。

是否可以使用像 Xwalkview 这样的自定义 WebView? 或者两者之间的套接字连接? ARCore 正在与 Three.js 实时通信,如何实现?

回调存在的原因是因为它不能从 android 应用程序立即完成。

主要原因是Android使用WebView到运行javascript。现代 Android WebView 只是包裹在 android 视图中的 Google Chrome 的一个实例。如您所知,此实例需要 运行 在单独的进程中。如果选择深入挖掘,他会发现 android 应用程序和 WebView 之间的通信是通过 AIDL 服务完成的,因为所有进程间通信都应该在 android.[=14= 中完成]

考虑到将 AIDL 调用写入堆栈所需的时间,分配内存并形成消息(主要的 AIDL 通信方法),发送它,在 Chrome 中解包,解析,执行 javascript并再次执行所有这些操作以回答 - 10ms - 50ms 是非常低的延迟。

也许ArCore有自己的js处理器来快速处理js文件。或者 Google Chrome 有自己的方法来与 ArCore(或内部实例)通信。我不知道 - 但它是 Google 开发的产品 - 我认为他们知道他们的捷径。

自定义 WebView 可能有效 - 唯一的问题是基本上它将是一个新版本的浏览器,由于一大堆可能原因。

希望对你有所帮助。

从 kitkat 开始,使用 evaluateJavascript 方法而不是 loadUrl 来调用 javascript 函数,如下所示:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
    webView.evaluateJavascript("enable();", null);
} else {
    webView.loadUrl("javascript:enable();");
}

您可以通过设置使用函数调用延迟:

window.setTimeout(function () { ... })

但是,它不一定会立即运行,也不会明确设置延迟。如果您将使用 setTimeout,它会从执行队列中删除函数,并且只会在 JavaScript 完成当前执行队列后调用它。

console.log(1);
setTimeout(function() {console.log(2)});
console.log(3);
console.log(4);
console.log(5);
//console logs 1,3,4,5,2

有关详细信息,请参阅 http://javascriptweblog.wordpress.com/2010/06/28/understanding-javascript-timers/

希望您会找到答案。干杯!