我的代码遇到了一个特殊问题。 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的示例代码。
答案 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;
}
}-*/;
所以这段代码可行。