gpt4 book ai didi

java - 从 GWT JSNI 的内部函数调用 Java 方法

转载 作者:行者123 更新时间:2023-12-03 02:07:47 25 4
gpt4 key购买 nike

我正在使用 W3C Geolocation API 来检索 GWT Web 应用程序中的位置信息。 Geolocation API 的构建方式是,一旦检索到位置位置,就会调用回调函数。

我当前的测试代码如下:

public native void getCoordinates() /*-{
function onPositionUpdate(position) {
var lat = position.coords.latitude;
var lng = position.coords.longitude;
var alt = position.coords.altitude;

// not OK,- doesn't get invoked, and function execution stops at this point
this.@com.test.GpsPanel::testMethod()();

alert("Coordinates retrieved: " + lat + ";" + lng + ";" + alt);
}

function onPositionUpdateFailed(error) {
alert("Some error");
}

if(navigator.geolocation) {
// OK when invoked somewhere here
this.@com.test.GpsPanel::testMethod()();

navigator.geolocation.getCurrentPosition(onPositionUpdate, onPositionUpdateFailed);
} else {
alert("Geolocation is not available");
}
}-*/;

我试图证明方法 testMethod 不会从内部方法 onPositionUpdate 调用。更重要的是:之后不会显示任何警报(当删除 testMethod 调用时会显示警报),但在日志中没有发现警告或错误。

我的问题是:如何从内部函数引用这个方法?我感觉 this. 不是内部函数的正确引用。如果无法正确引用 Java 类,那么可能的解决方法是什么?请注意,我无法将任何其他内容传递给函数 onPositionUpdate(),因为它是一个回调函数。

最佳答案

当实际执行 JSNI block 内的 javascript 中定义的函数时,this 超出了范围。

this周围添加一个闭包:

public native void getCoordinates()
/*-{

var that = this;

function onPositionUpdate(position) {
var lat = position.Wecoords.latitude;
var lng = position.coords.longitude;
var alt = position.coords.altitude;

that.@com.test.GpsPanel::testMethod()();

alert("Coordinates retrieved: " + lat + ";" + lng + ";" + alt);
}

// ...
}-*/;

我确信这已记录在谷歌的 JSNI 文档中的某个地方,至少在一个传递的示例中,但我现在找不到它。

这也可以通过将实例传递给 JavaScript 注入(inject)来完成,例如:

public native void getCoordinates(com.test.GpsPanel instance)
/*-{

function onPositionUpdate(position)
{
var lat = position.Wecoords.latitude;
var lng = position.coords.longitude;
var alt = position.coords.altitude;

instance.@com.test.GpsPanel::testMethod()();

alert("Coordinates retrieved: " + lat + ";" + lng + ";" + alt);
}

// ...
}-*/;

关于java - 从 GWT JSNI 的内部函数调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11595722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com