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



