我想知道,如果有一段时间,我可以访问我的对象
是的,我认为存在延迟,因为将在 WebView 的内部工作线程中运行。也许您已经考虑过这一点,并意识到WebView必须维护至少一个工作线程才能执行异步网络IO。也许您在使用WebView时也注意到了DDMS中的这些线程。WebView.addJavascriptInterface
事实证明,它还使用线程来为许多其他公共方法工作。我真的希望谷歌的文档能更清楚地说明这一点!但我希望我能提供帮助,并向您展示我如何试图为自己确认这一点。
跟着我看看WebView的源代码。它具有合理的可读性,即使您无法准确了解正在发生的事情,也可以通过回答有关线程的一些问题进行跟踪。
您可以通过SDK管理器工具下载Android框架源代码,但它也在Github上镜像,因此这就是我在此处链接的内容。我猜到了一个标签,它接近于某个版本的ICS。找到WebView.addJavascriptInterface
并不难。我刚刚谷歌了“WebView.java网站:github.com/android”。
该方法将消息发送到 的实例:WebView.addJavascriptInterface
WebViewCore
mWebViewCore.sendMessage(EventHub.ADD_JS_INTERFACE, arg);
其中有一堆重载方法称为sendMessage
,但我们真的不需要知道究竟在调用哪个,因为它们几乎做同样的事情。甚至还有一个很好的评论,给我们一个暗示,我们来对地方了!它们都委托给 EventHub
的一个实例,该实例是某个内部类。此方法结果是同步的,并且正在向 的实例发送一条消息,这很好地表明它可能在另一个线程中运行,但为了完整性,让我们找出答案!WebViewCore.java
Handler
这是在EventHub.transferMessages
中实例化的,它是从WebViewCore.initialize调用的
。这里还有几个跃点,但最终我发现这是从 in (subclass of ) 调用的,它与此处的新右键一起实例化。Handler
run
WebCoreThread
Runnable
Thread
真是一场冒险!因此,即使我真的不能确定所有这些移动部件发生了什么,但我非常有信心地说这种方法不是同步的,并向WebView的工作线程发送消息。我希望这是有道理的!
如果是这样,我如何知道我应该等待多长时间才能调用我的对象?
不幸的是,我不知道这个问题的答案。我正在研究这个确切的问题,并在谷歌搜索过程中在StackOverflow上发现了这个问题。我认为您有以下选择,其中一些比其他选项更好或更容易:
1)只是100毫秒或介于和之间。Blech,我不喜欢这样,但它可能是最简单的。Thread.sleep
addJavascriptInterface
loadUrl("javascript:...")
2)另一种可能性是,您可以使用JavaScript片段进行调用,该片段专门测试接口是否已设置,并捕获尚未设置的ReferenceError。但是,正如您可能已经猜到的那样,这涉及将JavaScript接口添加到WebView!WebView.loadUrl
3)改为调用,并捕获JavaScript或代替。从我的实验来看,这种方法是同步的,所以没有延迟。(我已经在源代码中确认了这一点,但我会留下细节作为读者的练习)你应该想出一些特殊的字符串来调用并在里面检查它,所以你不只是抓住所有的。WebView.setWebChromeClient
alert()
console.log
alert
onJsAlert
alert()
很抱歉这个答案的长度,我希望这有帮助。祝你好运!