0

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
);
}
Steven Hunt
  • 2,321
  • 19
  • 18
sara
  • 1
  • 2
  • In this case use rxjava (observable) look at [this](https://stackoverflow.com/questions/21890338/when-should-one-use-rxjava-observable-and-when-simple-callback-on-android) exemple – khaled ouartsi Jun 22 '18 at 19:22
  • Thanks for your help i'll try it . – sara Jun 23 '18 at 08:57

0 Answers0