Javascript 接口回调在 android webview API 中不起作用 >= 21 与 GWT 2.7 j

Javascript interface Callback not working in android webview API >= 21 with GWT 2.7 javascript

本文关键字:GWT 回调 接口 android webview 不起作用 API Javascript      更新时间:2023-09-26

我的代码遇到了一个特殊的问题。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;
    }
}-*/;

所以这段代码有效。