- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我知道要从 Javascript 与 Java 交互,您必须使用 webview 中的 addjavascriptInterface 方法注入(inject) Java 对象。
这是我面临的问题。
我使用 addJavascriptInterface
方法注册了一个 java 对象,以便在我的 JS 中可用。
我使用 webview.loadURL("javascript:XXX");
我在完成 JS 注入(inject)后发送一个 JS 事件。
问题是,如果在第 1 步之后,如果我立即执行以下 Javascript:
mWebView.loadUrl("javascript:if(window.myobject) console.log('myobject found---------'); else {console.log('myobject not found----');}");
我在控制台的日志中看到“找不到我的对象”。
我想知道我是否需要一段时间才能访问我的对象,如果是,我如何知道我应该等待多长时间才能调用我的对象?
最佳答案
I want to know that if there is some time before i can access my object
是的,我认为有延迟,因为 WebView.addJavascriptInterface
将在 WebView 的内部工作线程中运行。或许你已经想到了这一点,意识到 WebView 至少要维护一个工作线程来做异步网络 IO。也许您在使用 WebView 时也注意到了 DDMS 中的这些线程。
事实证明,它还使用一个线程来为许多其他公共(public)方法工作。我真的希望 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
,但我们并不需要知道究竟是哪个被调用,因为它们做的事情几乎相同。甚至有一个很好的评论给我们一个提示,我们在正确的地方!所有这些都委托(delegate)给 EventHub
的实例。这是一些内部类。 This method结果是同步的,并且正在向 Handler
的实例发送消息,这很好地表明这可能正在另一个线程中运行,但为了完整起见,让我们找出来!
Handler
在 EventHub.transferMessages
中实例化从 WebViewCore.initialize
调用.这里还有几跳,但最终我发现这是从WebCoreThread
(Runnable
的子类)中的run
调用的,也就是与新的 Thread
一起实例化 here .
多么冒险!所以,尽管我真的不能确定所有这些移动部件发生了什么,但我很有信心说这种方法不是同步的,而是向 WebView 的工作线程发送消息。我希望这是有道理的!
if so, how do i get to know how much time should i wait to call my object?
很遗憾,我不知道这个问题的答案。我正在研究这个确切的问题,并在我的谷歌搜索过程中在 StackOverflow 上发现了这个问题。我认为您有以下选择,其中一些比其他更好或更容易:
1) 只需 Thread.sleep
100 毫秒或介于 addJavascriptInterface
和 loadUrl("javascript:...")
之间的时间。 Blech,我不喜欢这个,但它可能是最简单的。
2) 另一种可能性是,您可以使用 JavaScript fragment 调用 WebView.loadUrl
,该 fragment 专门测试接口(interface)是否已设置,如果尚未设置,则捕获引发的 ReferenceError。但是,正如您可能已经猜到的那样,这种类型涉及向 WebView 添加 JavaScript 接口(interface)!
3) 改为调用 WebView.setWebChromeClient
,并改为捕获 JavaScript 的 alert()
或 console.log
。根据我的实验,这个方法是同步的,所以没有延迟。 (我已经在源代码中确认了这一点,但我会将细节作为练习留给读者)你可能应该想出一些特殊的字符串来调用 alert
并在 onJsAlert 中检查它
,所以您不只是捕获所有 alert()
。
对不起,这个答案的长度,我希望这会有所帮助。祝你好运!
关于java - 了解Android的webview addjavascriptinterface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962150/
Webview shouldInterceptRequest方法总是返回null。我去了adblocking的use方法。我尝试了很多adblock方法,但是总是需要这个shouldIntercept
在我的 Native React 项目中,我想使用 WebView。 HTML是指外部的css文件,css文件是指一些自定义字体。 鉴于此层次结构: app/ app/index.ios.js app
我在一个页面上有多个 webview,当应用程序加载时,主页面卡住了将近 8-10 秒,我猜测这是所有 webview 加载各自网站所花费的时间,为什么 Ui 卡住了,我怎么能使 webview 加载
nativescript 中的 webview 是否有“导航”事件? 我已经在 Xamarin (c#) 中用 完成了 Browser.Navigating += Myfunction natives
我的浏览器 (webview) 以 HTML 页面开头 FILEJAVA.class.getResource ("FILEHTML.html")。 ToExternalForm () 每当我访问谷歌时
我们正在开发一个 JavaFX 2.x 应用程序,它需要提供一些 GIS 支持。我们得出的结论是,通过嵌入式 WebView 使用 GoogleMaps 是最快的选择。它的问题在于每次我们的应用程序启
有没有办法销毁 WebView 实例?如果页面加载,并说视频开始播放,我希望能够,当我隐藏 WebView 时,基本上可以销毁它,或者至少重置它。 我知道我可以听 visibleProperty 并执
有没有办法在不启用远程模块的情况下在 webview 和主窗口之间进行通信? When this attribute is false the guest page in webview will
我使用以下代码来拦截Web View 中的对话框,但看不到内容或无法与之交互: Element webview= querySelector("#webview"); Map map=new
我正在创建一个页面,该页面将在 Java 的 WebView 中打开,或在外部浏览器中手动打开。如果页面是从 Java 加载的——我需要它来执行特定的回调,因为 Java 被用作一种后端,但如果页面是
我有一个 React Native WebView ,它运行一个小的 HTML 文档。该文档显示了一些图像。 我希望显示位于应用程序的 Documents 文件夹中的图像,即图像不是静态 Assets
我正在使用 JavaFX webview 开发一个网络爬虫。出于抓取目的,我不需要加载图像。当页面被加载时,Webkit 会产生很多 UrlLoader 线程。所以我认为最好禁用图像,这样我会节省很多
这个问题在这里已经有了答案: Android webview launches browser when calling loadurl (11 个答案) 关闭 7 年前。 我花了两天的时间来寻找一
我正在加载一个网页,我想使用基本身份验证登录,我有使用 Swift 的经验并且能够像下面那样执行基本身份验证,但我无法为我的应用程序的 Flutter 版本实现基本身份验证。 ---- swift 代
我用 webview 创建了应用程序,我想在 webview 中加载所有内部链接并在 android 浏览器中加载外部链接。现在的问题是我正在使用 html 广告,当我点击广告时我想打开外部浏览器,但
我需要在父背景图案上显示我的 webview 内容。有没有直接的方法来做到这一点? 最佳答案 这可能有用 final com.sun.webkit.WebPage webPage = com.sun.
是否可以从 webview 中加载的页面读取 http 请求和响应数据。我想要做的是在用户单击 webview 中页面内的链接后从响应中获取二进制数据。任何帮助或线索将不胜感激 最佳答案 创建您自己的
我有一个简单的WebView在 Android 上运行 Web 应用程序。问题是当我旋转手机以将其更改为横向 webview重新加载并回到开头。 我怎样才能防止这种行为? 罗恩 最佳答案 从 Andr
我创建了一个带有 webview 标签的自定义浏览器。当我在 google.it(或 google.com)中导航时,有时会出现一条消息说 chrome 已过时。我的应用版本是: Node.js 8.
我正在使用 Electron 创建简单的网络浏览器。我的用例是我需要通过不同/各自的代理 IP 路由每个 URL。如果用户输入 google.com,则必须通过 123.123.122.1:8081
我是一名优秀的程序员,十分优秀!