【问题标题】:Javascript interface Callback not working in android webview API >= 21 with GWT 2.7 javascriptJavascript 接口回调在 GWT 2.7 javascript 的 android webview API >= 21 中不起作用
【发布时间】:2016-02-12 07:44:49
【问题描述】:

我的代码遇到了一个特殊问题。 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 设置为“未定义”。谁能告诉我这有什么问题,或者给我一个使用 GWT javascript 的示例代码,该代码适用于 Android API 级别 21 及更高级别。

【问题讨论】:

  • 可能是竞争条件?您可能想将其放入 Timer 以确保它不是。
  • 我尝试添加 setTimeout(function () {$wnd.setHeading(heading);}, 3000);它奏效了!!非常感谢!
  • 我已将其添加为答案。请接受它:)

标签: javascript java android gwt android-webview


【解决方案1】:

也许是竞争条件?您可能想将其放入 Timer 以确保它不是。

更新

由于这确实是一个竞争条件,将计时器设置为 1 毫秒就足够了,使用以下可能是最佳实践:

Scheduler.scheduleDeferred

http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsDelayed.html

【讨论】:

    【解决方案2】:

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

    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;
        }
    }-*/;
    

    所以这段代码有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多