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

时间:2012-07-21 20:47:46

标签: java gwt jsni

我正在使用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(),因为它是一个回调函数。

2 个答案:

答案 0 :(得分:8)

当实际执行JSNI块中的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注入来实现,例如:

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);
    }

    // ...
}-*/;

答案 1 :(得分:3)

导致相同行为的相关琐碎错误是在调用Java方法时忘记第二对括号。第一对重新声明方法头以用于识别目的,而第二对包含实际参数。当没有争论时,这个错误特别容易,例如

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