2016-03-02 65 views
2

我使用Google Distance Matrix API來計算不同經緯度之間的距離。我呼籲各自的API低於DistanceMatrix API的回調函數

public void computeDistanceAndTime() 
{  
     try 
     { 
      DistanceMatrixApiRequest req =  DistanceMatrixApi.newRequest(Context.getContext()).origins(src) 
        .destinations(dst).mode(TravelMode.WALKING); 
       DistanceMatrix matrix = req.await(); 
     } 
     catch (OverQueryLimitException o) 
     { 
      System.out.println(o.getMessage()); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 

提到其實我想設置使用setCallback功能DistanceMatrixApiRequest回調。所以我假設,而捕捉excepetion回調會被調用,並能避免

com.google.maps.internal.OkHttpPendingResult從谷歌重試

例外。 現在我不知道如何設置回調像

  1. 回撥的簽名是什麼?
  2. 我們是否需要繼承任何類來設置回調
  3. 該函數的參數是什麼?
  4. 我假設在調用await函數之前需要調用,我是否正確?

我能看到的天氣預報一個例子像下面,

req.setCallback(new PendingResult.Callback<GeocodingResult[]>() { 
    @Override 
    public void onResult(GeocodingResult[] result) { 
    // Handle successful request. 
    } 

    @Override 
    public void onFailure(Throwable e) { 
    // Handle error. 
    } 
}); 

即使我跟隨在距離矩陣相似的方式我不是全成。

req.setCallback(new PendingResult.Callback<DistanceMatrix[]>() { 
    @Override 
    public void onResult(DistanceMatrix[] result) { 
    // Handle successful request. 
    } 

    @Override 
    public void onFailure(Throwable e) { 
     System.out.println("There is a failure in Distance function"); 
    } 
}); 

回答

2

下面是使用​​與回調代替await()的一個例子。請注意,由於OkHTTP在後臺線程調用回調,我需要使用CountDownLatch

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.maps.DistanceMatrixApi; 
import com.google.maps.DistanceMatrixApiRequest; 
import com.google.maps.GeoApiContext; 
import com.google.maps.PendingResult; 
import com.google.maps.model.DistanceMatrix; 

import java.util.concurrent.CountDownLatch; 

public class DistanceMatrixApp { 
    public static void main(String[] args) throws InterruptedException { 
    GeoApiContext context = new GeoApiContext(); 
    context.setApiKey("[API KEY]"); 
    DistanceMatrixApiRequest req = DistanceMatrixApi.getDistanceMatrix(context, 
    new String[]{"Sydney Town Hall"}, 
    new String[]{"Parramatta Station"}); 

    final CountDownLatch latch = new CountDownLatch(1); 
    req.setCallback(new PendingResult.Callback<DistanceMatrix>() { 
     @Override 
     public void onResult(DistanceMatrix result) { 
     Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
     System.out.println(gson.toJson(result)); 
     latch.countDown(); 
     } 

     @Override 
     public void onFailure(Throwable e) { 
     System.out.println("Exception thrown: "+e); 
     latch.countDown(); 
     } 
    }); 

    // We have to hold the main thread open until callback is called by OkHTTP. 
    latch.await(); 
    } 
} 
+0

感謝佈雷特的詳細解釋。 – Sunny

+0

請將我的答案標記爲已接受。謝謝! – Brett

+0

Brett,我在上面提到的類似的行中寫了這個函數,但是不能在onFailure函數中獲得回調。所以我使用OverQueryLimitException來捕獲這個異常。 – Sunny