I am implementing an example from Github (Retrofit 2, Jackson parser and google map distance-matrix API), to calculate the distance between nodes using distance-matrix API in an android application, the example sends only one request, and because there is a limited number of destinations and origins, I have to send multiple requests. The problem is when I tried a loop, it repeats the request until the nodes are over and don't read the response just the final one, any idea why is that?
private void getDistanceInfo() {
// https://maps.googleapis.com/maps/api/distancematrix/json?destinations=Atlanta,GA|New+York,NY&origins=Orlando,FL&units=metric&key=AIzaSyC8RepIY9p7Jv-6wet6qDTtOPJfgPiLN_Q
for ( t = 0; t < points_arc.length-1; t++) {
for ( g = 0; g < points_arc.length-1; g++) {
Map<String, String> mapQuery = new HashMap<>();
mapQuery.put("units", "metric");
mapQuery.put("origins",points_arc[t]);
mapQuery.put("destinations",points_arc[g]);
mapQuery.put("key", "...");
DistanceApiClient client = RestUtil.getInstance().getRetrofit().create(DistanceApiClient.class);
Call<DistanceResponse> call = client.getDistanceInfo(mapQuery);
call.enqueue(new Callback<DistanceResponse>() { //the line where it stops back to the loop
@Override
public void onResponse(Call<DistanceResponse> call, Response<DistanceResponse> response) {
if (response.body() != null &&
response.body().getRows() != null &&
response.body().getRows().size() > 0 &&
response.body().getRows().get(0) != null &&
response.body().getRows().get(0).getElements() != null &&
response.body().getRows().get(0).getElements().size() > 0 &&
response.body().getRows().get(0).getElements().get(0) != null &&
response.body().getRows().get(0).getElements().get(0).getDistance() != null &&
response.body().getRows().get(0).getElements().get(0).getDuration() != null) {
Element element = response.body().getRows().get(0).getElements().get(0);
// showTravelDistance(element.getDistance().getValue());
mat[t][g] = element.getDistance().getValue();
mat_time[t][g] = element.getDuration().getValue();
}
@Override
public void onFailure(Call<DistanceResponse> call, Throwable t){
}
Update: after implementing RxJava i don't get any answer, i am new to RxJava so please point out any possible errors.
private void getDistanceInfo() {
for ( t = 0; t < points_arc.length-1; t++) {
for (g = 0; g < points_arc.length - 1; g++) {
Map<String, String> mapQuery = new HashMap<>();
mapQuery.put("units", "metric");
mapQuery.put("origins", points_arc[t]);
mapQuery.put("destinations", points_arc[g]);
mapQuery.put("key", "...");
DistanceApiClient client = RestUtil.getInstance().getRetrofit().create(DistanceApiClient.class);
Observable<Response<DistanceResponse>> call= client.getDistanceInfo(mapQuery);
Context context = getApplicationContext();
CharSequence text = "Connecting";
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
call.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe();
new Subscriber<Response<DistanceResponse>>() {
@Override
public final void onCompleted() {
// do nothing
}
@Override
public final void onError(Throwable e) {
Log.e("GithubDemo", e.getMessage());
}
@Override
public void onNext(Response<DistanceResponse> response) {
// Response<DistanceResponse> response;
// public void handleResponse(Observable<DistanceResponse> call, Response<DistanceResponse> response) {
for (int j = 0; j < points_arc.length - 1; j++) {
for (int i = 0; i < points_arc.length - 1; i++) {
if (response.body() != null &&
response.body().getRows() != null &&
response.body().getRows().size() > 0 &&
response.body().getRows().get(0) != null &&
response.body().getRows().get(0).getElements() != null &&
response.body().getRows().get(0).getElements().size() > 0 &&
response.body().getRows().get(0).getElements().get(0) != null &&
response.body().getRows().get(0).getElements().get(0).getDistance() != null &&
response.body().getRows().get(0).getElements().get(0).getDuration() != null) {
Element element = response.body().getRows().get(0).getElements().get(0);
// showTravelDistance(element.getDistance().getValue());
mat[j][i] = element.getDistance().getValue();
mat_time[j][i] = element.getDuration().getValue();
}
}
also changed:
public interface DistanceApiClient {
@GET("maps/api/distancematrix/json")
Observable<Response<DistanceResponse>> getDistanceInfo(
@QueryMap Map<String, String> parameters
);
}