如何从Android Java调用WebView Javascript中的函数而不会延迟?



使用此方法调用javascript函数时,回调中存在几毫秒级延迟(10ms - 50ms(

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

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

像Xwalkview这样的自定义WebView可以吗? 还是两者之间的插座连接? ARCore正在与Three实时沟通.js,如何实现这一目标?

回调之所以存在,是因为它无法从安卓应用程序立即完成。

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

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

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

自定义WebView可能会起作用 - 唯一的问题是,基本上它将是一个新版本的浏览器,由于一大堆可能的原因,您需要独立于所有其他浏览器支持您的 js。

希望它以某种方式对您有所帮助。

从 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/

希望你能找到答案。干杯!

最新更新