Aks*_*hat 21 javascript java android webview
我知道要从Javascript到Java进行交互,您必须使用webview中的addjavascriptInterface方法注入Java对象.
这是我面临的问题.
我使用addJavascriptInterface方法在我的JS中注册一个java对象.
我在webview中使用了几个JS webview.loadURL("javascript:XXX");
当我完成注入JS时,我发送了一个JS事件.
问题是如果在第1步之后立即执行以下Javascript:
mWebView.loadUrl("javascript:if(window.myobject) console.log('myobject found---------'); else {console.log('myobject not found----');}");
Run Code Online (Sandbox Code Playgroud)
我在控制台的日志中找到"myobject not found".
我想知道如果有一段时间我可以访问我的对象,如果有,我怎么知道我应该等多少时间来调用我的对象?
mic*_*kig 47
我想知道如果有一段时间我可以访问我的对象
是的,我认为有一个延迟,因为WebView.addJavascriptInterface将在WebView的内部工作线程中运行.也许您已经考虑过这一点,并意识到WebView必须至少维护一个工作线程来执行异步网络IO.也许您在使用WebView时也注意到DDMS中的这些线程.
事实证明,它还使用一个线程为许多其他公共方法工作.我真的希望谷歌的文档更清楚!但我希望我可以帮助并向您展示我是如何为自己确认的.
跟我来看看WebView的源代码.它具有相当的可读性,即使您无法完全按照正在进行的操作,也可以通过回答有关线程的一些问题进行追踪.
您可以通过SDK管理器工具下载Android框架源代码,但它也在Github上进行镜像,这就是我在这里链接的内容.我猜测并选择了一个与某些版本的ICS接近的标签.这不难发现WebView.addJavascriptInterface.我只是用Google搜索"WebView.java网站:github.com/android".
该方法WebView.addJavascriptInterface将消息发送到以下实例WebViewCore:
mWebViewCore.sendMessage(EventHub.ADD_JS_INTERFACE, arg);
Run Code Online (Sandbox Code Playgroud)
在WebViewCore.java调用了一堆重载方法sendMessage,但是我们并不需要知道究竟是哪个被调用,因为它们几乎完全相同.甚至有一个很好的评论给我们一个提示,我们在正确的地方!所有这些都委托给一个EventHub内部类的实例.这个方法结果是同步的,并且正在向一个实例发送消息Handler,这很好地表明这可能在另一个线程中运行,但为了完整起见,让我们找出答案!
这Handler是在实例化中EventHub.transferMessages调用的WebViewCore.initialize.这里有几个跳,但最终我发现这是从runin WebCoreThread(子类Runnable)中调用的,它在这里实例化了一个新的Thread权利.
多么冒险!所以,即使我真的无法确定所有这些移动部件的发生情况,我很自信地说这个方法不是同步的,并向WebView的工作线程发送消息.我希望这是有道理的!
如果是这样,我怎么知道我应该等多少时间来调用我的对象?
不幸的是,我不知道答案.我正在研究这个确切的问题,并在我的谷歌搜索过程中在StackOverflow上发现了这个问题.我认为您有以下选项,其中一些比其他选项更好或更容易:
1)只需Thread.sleep100毫秒或介于两者之间addJavascriptInterface和loadUrl("javascript:...").Blech,我不喜欢这个,但它可能是最简单的.
2)另一种可能性是你可以调用WebView.loadUrl一段JavaScript来专门测试接口是否设置,并捕获引发的ReferenceError,如果它还没有设置的话.但是,正如您可能已经猜到的那样,这种方法涉及向WebView添加JavaScript接口!
3)WebView.setWebChromeClient改为调用,捕获JavaScript alert()或console.log代替.从我的实验来看,这种方法是同步的,所以没有延迟.(我已经在源代码中证实了这一点,但我会将细节作为练习留给读者)你应该想出一些特殊的字符串来调用alert它并在里面检查它onJsAlert,所以你不只是捕捉所有alert()的.
对不起这个答案的长度,我希望有所帮助.祝好运!
| 归档时间: |
|
| 查看次数: |
16127 次 |
| 最近记录: |