Javascript接口回调在android webview API中不起作用>;=21和GWT2.7JavaScript
我的代码面临一个特殊的问题。javascript回调在api级别为19或更低的设备上工作,但在api 21或更高级别上不工作。奇怪的是,正常的Html javascript回调在所有API级别上都能工作。我没有用proguard。这是我的密码: MainActivity.javaJavascript接口回调在android webview API中不起作用>;=21和GWT2.7JavaScript,javascript,java,android,gwt,android-webview,Javascript,Java,Android,Gwt,Android Webview,我的代码面临一个特殊的问题。javascript回调在api级别为19或更低的设备上工作,但在api 21或更高级别上不工作。奇怪的是,正常的Html javascript回调在所有API级别上都能工作。我没有用proguard。这是我的密码: MainActivity.java WebAppInterface wai = new WebAppInterface(this, this); myWebView.addJavascriptInterface(wai, "Android"); myWe
WebAppInterface wai = new WebAppInterface(this, this);
myWebView.addJavascriptInterface(wai, "Android");
myWebView.loadUrl("http://192.168.2.246/abhishek/test/");
WebAppInterface.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!!");
}
}
爪哇:
我在棒棒糖和更高版本上得到了“未定义”的Android类型。谁能告诉我这有什么问题,或者给我一个在Android API level 21及以上版本上运行的GWT javascript示例代码。超时延迟似乎解决了这个问题。我不知道它是怎么工作的
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;
}
}-*/;
所以这个代码是有效的。可能是竞争条件?你可能想把它放在一个计时器里,以确保它不是 更新: 由于这确实是一种竞争条件,将计时器设置为1ms可能就足够了,使用以下可能是最佳实践:
Scheduler.scheduleDeferred
参见可能是比赛条件?您可能需要将其放入计时器中,以确保它不存在。我尝试添加setTimeout(函数(){$wnd.setHeading(heading);},3000);成功了!!非常感谢!我加上它作为一个答案。请接受:)
Scheduler.scheduleDeferred