Javascript 接口回调在 android webview API 中不起作用 >= 21 与 GWT 2.7 j
Javascript interface Callback not working in android webview API >= 21 with GWT 2.7 javascript
我的代码遇到了一个特殊的问题。javascript 回调在 api 级别为 19 或更低的设备上工作,但在 API 21 及更高版本上不起作用。奇怪的是正常的 Html javascript 回调在所有 API 级别上都有效。我没有使用proguard。这是我的代码:
主要活动.java
WebAppInterface wai = new WebAppInterface(this, this);
myWebView.addJavascriptInterface(wai, "Android");
myWebView.loadUrl("http://192.168.2.246/abhishek/test/");
网络应用界面.java
class WebAppInterface {
Context mContext;
MainActivity parent;
/** Instantiate the interface and set the context */
WebAppInterface(Context c, MainActivity parent) {
mContext = c;
this.parent = parent;
}
@JavascriptInterface
public void setHeading(String heading) {
Toast.makeText(mContext, "Setting heading to " + heading, Toast.LENGTH_SHORT).show();
}
}
GWT代码:
JavaScript:
function setHeading(heading) {
console.log("setting heading...");
// Android callback
if(typeof Android !== 'undefined'){
Android.setHeading(heading);
}
if(typeof Android == 'undefined') {
console.log("undefined!!");
}
}
.java:
public static final native void setAppHeading(String heading) /*-{
$wnd.setHeading(heading);
}-*/;
我在棒棒糖及以上版本上将Android类型设置为"未定义"。谁能告诉我这有什么问题,或者给我一个使用 GWT javascript 的示例代码,该代码适用于 Android API 级别 21 及更高版本。
也许是竞争条件?您可能希望将其放入计时器中,以确保它不是。
更新:
由于这确实是一种争用条件,因此将计时器设置为 1ms 可能就足够了,使用以下方法可能是最佳做法:
Scheduler.scheduleDeferred
请参阅 http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsDelayed.html
超时延迟似乎解决了这个问题。我不知道如何,但它有效。
public static final native void setAppHeading(String heading) /*-{
setTimeout(function() {$wnd.setHeading(heading);}, 3000);
}-*/;
事实证明,回调对象是在窗口级别附加的,javascript代码是在GWT创建的内部iFrame中执行的。
public static final native void setAppHeading(String heading) /*-{
if(typeof $wnd.Android !== 'undefined'){
$wnd.Android.setHeading(heading);
return;
}
}-*/;
所以这段代码有效。
相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- 如何使用jqueryAJAX从页面中回调多个变量
- jquery Onclick函数带有导致双击的回调排序函数
- Javascript点击事件回调不起作用
- 一旦加载并渲染了角度引导typeahead,就使用回调
- 成功回调永远不会被JSONP请求调用
- Javascript 接口回调在 android webview API 中不起作用 >= 21 与 GWT 2.7 j
- 如何在GWT ui中使用JavaScript回调函数