@xiaoyixy
2015-12-06T22:31:12.000000Z
字数 1035
阅读 2066
Hybrid
在 Java 层中调用 JavaScript 方法并不和在 JavaScript 层中调用 Java 方法般直接。其原因 Javascript 对象并不会暴露在 Java 层中,因此调用 JavaScript 函数的方式应该是通过创建一个可传递到 WebView 执行的 JavaScript URL,但是,这种方法有两个技术上的缺陷:第一个是,首先你必须清晰了解 JavaScript 运行时的代码结构;第二是你必须确定 JavaScript URL 作为 JavaScript 的一个部分有一定的错误处理能力。
由于 JavaScript URL 可以传递到 WebView 中,因此在 JavaScript 环境中可使用 loadURL() (或者与之相似)API。此外, JavaScript 的接收对象必须设置为可在 Java 层中通过寻址找到,这可以通过把变量设为全局的或者创建某种形式的调度程序框架来将响应的结果传递到一个正确的接收对象。
从 Java 层到 JavaScript 层封送处理后的数据之所以如此的复杂,主要有以下两点原因:
1、 JavaScript 是单线程的,因此调用 JavaScript 会牵涉到向承载 JavaScript 引擎的线程封装响应的参数。
2、 JavaScript URL 方法早已存在,并且相比于重新创建一个完整的新 API ,是一种处理这种问题近乎完美的方式,没必要另起炉灶。
注:
♥ 如何向正确的 JavaScript 接收器发送数据
* 如果你在使用一种现有的混合式应用框架,例如 PhoneGap, Cordova 或者 Karura,那么这个问题已经为你解决;
* 你可以使用一些在 JavaScript 现存并可用的异步函数框架,例如 jQuery 的延迟对象框架(Deferred Object Framework);
* 自行编写一个自定义框架。
♥ 延迟对象模式(Deferred Object Pattern)
延迟对象模式是一种被很多 JavaScript 应用程序用于解耦来自代码的一些请求的关键模式,这些代码用于处理请求的结果而且允许多个回调被附加在最终提示的结果上。为了实现解耦的操作,延迟对象(Deferred Object)提供了允许回调函数被寄存起来处理成功、失败或者请求过程的函数。以下实现在 jQuery 中创建一个延迟对象:
var deferred = $.Deferred();
// var deferred = new Deferred();
// var deferred = jQuery.Deferred();