Javascript界面​​回调在android webview API> = 21中无法使用GWT 2.7 javascript

时间:2016-02-12 07:44:50

标签: 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");
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!!");
    }
}

的java:

public static final native void setAppHeading(String heading) /*-{
    $wnd.setHeading(heading);
}-*/;

我在棒棒糖及以上版本中将typeof Android视为'undefined'。任何人都可以告诉我这有什么问题,或者给我一个适用于Android API 21级及以上级别的GWT javascript的示例代码。

2 个答案:

答案 0 :(得分:2)

也许是竞争条件?你可能想把它放在一个Timer中,以确保它不是。

<强>更新

由于它确实是一种竞争条件,将计时器设置为1ms可能就足够了,使用以下内容可能是最佳做法:

Scheduler.scheduleDeferred

请参阅http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsDelayed.html

答案 1 :(得分:0)

超时延迟似乎解决了这个问题。我不知道它是如何工作的。

public static final native void setAppHeading(String heading) /*-{
    setTimeout(function() {$wnd.setHeading(heading);}, 3000);
}-*/;

结果是在窗口级别附加了回调对象,并且在GWT创建的内部iFrame中执行了javascript代码。

public static final native void setAppHeading(String heading) /*-{
    if(typeof $wnd.Android !== 'undefined'){ 
        $wnd.Android.setHeading(heading);
        return;
    }
}-*/;

所以这段代码可行。