下面有一个方法可以将地址转换为经度/纬度。 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;
}
答案 0 :(得分:4)
如果您想直接获得结果,请使用wait
和notify
等待结果:
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并在调用者中处理它,不返回任何内容,并将结果传递给将处理它的新代码(或直接在回调中处理它)