Дождитесь ответа от асинхронного вызова Retrofit 2 - PullRequest
0 голосов
/ 04 августа 2020

в моем Android внутри действия У меня есть асинхронный вызов API карт Google внутри метода, см. Код ниже:

public void reverseGeocode(String lat, String lng) {

        String geocodeApiUrl = getUrl(lat, lng);
        GoogleService googleService = GoogleServiceBuilder.buildService(GoogleService.class);
        Call<Address> geocodeRequest = googleService.geocodeAddress(geocodeApiUrl);


        geocodeRequest.enqueue(new Callback<Address>() {
            @Override
            public void onResponse(Call<Address> call, Response<Address> response) {

                if (response.errorBody() == null) {
                    if (response.body().getResults().length > 0) {
                        if (response.body().getResults()[0].getFormatted_address() != null) {
                            dropOffAddress = response.body().getResults()[0].getFormatted_address();
                        }


                    }

                } else {
                    Toast.makeText(AdressPicker.this, "An error has occured", Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<Address> call, Throwable t) {
                Toast.makeText(AdressPicker.this, "An error has occured", Toast.LENGTH_LONG).show();
            }
        });

    }

этот метод вызывается внутри маркера карты Google onMarkerDragEnd функция обратного вызова, см. Код ниже:

@Override
            public void onMarkerDragEnd(Marker marker) {

                double lat = marker.getPosition().latitude;
                double lng = marker.getPosition().longitude;
                reverseGeocode(String.valueOf(lat), String.valueOf(lng));
                marker.setSnippet(dropOffAddress);
                marker.showInfoWindow();
                editor.putString("dropOffAddress", dropOffAddress);
                editor.putString("lat", String.valueOf(lat));
                editor.putString("lng", String.valueOf(lng));
                editor.apply();
            }

Проблема здесь - первый раз, когда я перемещаю маркер, метод reverseGeocode вызывается, но его не ждут и onMarkerDragEnd продолжает свое выполнение и помещает нуль внутри значения переменной dropOffAddress , которая предназначена для отображения внутри фрагмента маркера.

Мой вопрос здесь КАК ЖДАТЬ для метода reverseGeocode - это ответ внутри onMarkerDragEnd перед продолжением выполнения?

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

единственное, что вы. нужен маркер, просто передайте его в качестве параметра в вызове модифицированного API примерно так.

public void reverseGeocode(String lat, String lng, Marker marker) {

    String geocodeApiUrl = getUrl(lat, lng);
    GoogleService googleService = GoogleServiceBuilder.buildService(GoogleService.class);
    Call<Address> geocodeRequest = googleService.geocodeAddress(geocodeApiUrl);


    geocodeRequest.enqueue(new Callback<Address>() {
        @Override
        public void onResponse(Call<Address> call, Response<Address> response) {

            if (response.errorBody() == null) {
                if (response.body().getResults().length > 0) {
                    if (response.body().getResults()[0].getFormatted_address() != null) {
                        dropOffAddress = response.body().getResults()[0].getFormatted_address();
                         applyGeoCode(marker)
                    }


                }

            } else {
                Toast.makeText(AdressPicker.this, "An error has occured", Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onFailure(Call<Address> call, Throwable t) {
            Toast.makeText(AdressPicker.this, "An error has occured", Toast.LENGTH_LONG).show();
        }
    });

}

теперь вызовите метод, передающий маркер

public void applyGeoCode(Marker marker){
      double lat = marker.getPosition().latitude;
      double lng = marker.getPosition().longitude;
      marker.setSnippet(dropOffAddress);
      marker.showInfoWindow();
      editor.putString("dropOffAddress", dropOffAddress);
      editor.putString("lat", String.valueOf(lat));
      editor.putString("lng", String.valueOf(lng));
      editor.apply();
}

, и вызовите его

        @Override
        public void onMarkerDragEnd(Marker marker) {
            reverseGeocode(String.valueOf(lat), String.valueOf(lng), marker);
        }
0 голосов
/ 04 августа 2020

Вы можете использовать CountDownLatch из класса java .utils.Concurrent. Вот пример:

public class DoSomething {
    private Address dropoffAddr;
    private CountDownLatch dropoffAddrLatch = new CountDownLatch(1);

    public void getAddressCallback(Address addr) {
        dropoffAddr = addr;
        dropoffAddrLatch.countDown();
    }

    @Override
    public void onMarkerDragEnd(Marker marker) {
        //your stuff
        reverseGeocode(...); //you should call getAddressCallback once you have everything
        dropOffAddrLatch.await(); //this will wait until getAddressCallBack has returned,
                                  // you can call dropoffAddrLatch.countDown() wherever you want.
        //finish your stuff
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...