Javascript接口回调在android webview API中不起作用>;=21和GWT2.7JavaScript

Javascript接口回调在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

我的代码面临一个特殊的问题。javascript回调在api级别为19或更低的设备上工作,但在api 21或更高级别上不工作。奇怪的是,正常的Html javascript回调在所有API级别上都能工作。我没有用proguard。这是我的密码:

MainActivity.java

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