2011-04-18 84 views
1

如何將result.getDistance()。inMeters()的結果保存爲距離?將回調存儲到變量

public class Route { 
    private double distance; 
    public Route() { 
    distance = 0; 
    run(); 
    } 

    public void run() { 
    Directions.load(query, opts, new DirectionsCallback() { 

     public void onFailure(int statusCode) { 
     Window.alert("Failed to route locations: " 
     + StatusCodes.getName(statusCode) + " " + statusCode); 
     } 

     public void onSuccess(DirectionResults result) { 
      distance = result.getDistance().inMeters(); 
     } 

    ); 
    } 
    public double getDistance() { 
    return distance; 
    } 
} 

在我的主要的Java文件,每當我做

Route route = new Route(); 
double distance = route.getDistance(); 

距離將始終爲0

+1

「在我的主要的Java文件,每當我做 路由路徑=新幹線() ; double distance = route.getDistance(); distance將始終爲0。 當然,因爲在構造函數Route()中將變量距離初始化爲0; – dominicbri7 2011-04-18 15:18:44

+0

'Directions.load()'是否啓動一個新線程?如果是這樣,你需要等到它完成之前,你距離。 – rsp 2011-04-18 15:21:57

回答

3

@dominic的評論是正確的:

「在我的主java文件,每當我做Route route = new Route(); double distance = route.getDistance();的距離將永遠是0.「當然,由於可變距離在構造函數Route()中初始化爲0;

你需要等待onSuccess回調執行之前getDistance()可以返回一個非零值。這個問題的典型解決方案只是執行一個依賴於getDistance()回調自身內部的代碼:

public void onSuccess(DirectionResults result) { 
    distance = result.getDistance().inMeters(); 
    doStuffThatDependsOn(distance); 
} 
0

您可以使用synchronized塊,直到的onSuccess的一個或onFailure處被調用。

在運行

()方法中添加:

synchronized(this) { 
    wait(); 
} catch (InterruptedException e) { 
... 
} 

而在的onSuccess和onFailure處添加:

synchronized(Route.class.this) { 
    notify(); 
} 
+2

GWT編譯成JavaScript並在單線程中在瀏覽器中運行。 – z00bs 2011-04-19 10:29:06