从java回调中获取值

时间:2010-12-05 21:27:31

标签: java

下面有一个方法可以将地址转换为经度/纬度。 LatLng是一个Google Maps API类,LonLat是我自己的自定义工具类。

下面不会工作,因为我无法在回调方法中设置变量coords。我不确定我是如何获得价值的。它可能很简单,但令我困惑。

提前致谢。

public LonLat convert(String address) {
    LonLat coords;
    geocoder.getLatLng(address, new LatLngCallback() {
        public void onFailure() {
            // TODO Exception handling

        }

        @Override
        public void onSuccess(LatLng point) {
            coords = new LonLat(point.getLongitude(), point.getLatitude());
        }

    });
    return coords;
}

2 个答案:

答案 0 :(得分:4)

如果您想直接获得结果,请使用waitnotify等待结果:

class MyLatLngCallback {

    LonLat coords = null;
    boolean gotAnswer = false;

    public synchronized void onFailure() {
        gotAnswer = true;
        notify();
    }

    @Override
    public synchronized void onSuccess(LatLng point) {
        gotCoords = true;
        coords = new LonLat(point.getLongitude(), point.getLatitude());
        notify();
    }
};

public LonLat convert(String address) {

    MyLatLngCallback cb = new MyLatLngCallback();                

    geocoder.getLatLng(address, cb);

    synchronized (cb) {
        while (!cb.gotAnswer) // while instead of if due to "spurious wakeups"
            cb.wait();
    }

    // if cb.coords is null then failure! 

    return cb.coords;
}

答案 1 :(得分:1)

只需将结果存储在回调对象的私有字段中,并通过getter访问它。

但由于这些回调是异步的,因此您不能指望立即获取该值。因此,您必须重新构建逻辑 - 而不是返回coords并在调用者中处理它,不返回任何内容,并将结果传递给将处理它的新代码(或直接在回调中处理它)