Передать значение за пределы метода - PullRequest
0 голосов
/ 12 января 2019

Я объявил источник и место назначения как глобальную переменную. Но хотя я не получаю правильное значение в dist. Что я должен сделать, чтобы передать значения location за пределами geoFire.getLocation () mehtod? Или как я могу получить расстояние между двумя геолокации по геофору?

Я попытался сделать статические источник и пункт назначения. Но это не сработало.

public double get_distance(String from, String to)
{
    source = new Location("to");
    destination = new Location("form");

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users");
    GeoFire geoFire = new GeoFire(databaseReference);

    geoFire.getLocation(from, new LocationCallback() {
        @Override
        public void onLocationResult(String key, GeoLocation location) {
            source.setLatitude(location.latitude);
            source.setLongitude(location.longitude);
            Log.e("source latlong b4 ",source.getLatitude()+"  ..  "+source.getLongitude()); // the right value is passed
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    Log.e("source latlong ",source.getLatitude()+"  ..  "+source.getLongitude()); //value hase turned into 0.0



    geoFire.getLocation(to, new LocationCallback() {
        @Override
        public void onLocationResult(String key, GeoLocation location) {
            destination.setLatitude(location.latitude);
            destination.setLongitude(location.longitude);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    Log.e("destination latlong", destination.getLatitude()+"  ..  "+destination.getLongitude());
    dist= source.distanceTo(destination);

    return dist;

}

1 Ответ

0 голосов
/ 13 января 2019

API Firebase являются асинхронными, это означает, что метод onLocationResult() возвращается сразу после его вызова, и обратный вызов из Задачи, которую он возвращает, будет вызван через некоторое время. Нет никаких гарантий относительно того, сколько времени это займет, может пройти от нескольких сотен миллисекунд до нескольких секунд, прежде чем эти данные станут доступны.

Поскольку этот метод возвращается немедленно, значение вашей переменной dist, которую вы пытаетесь вернуть в результате метода, еще не будет заполнено из обратного вызова.

По сути, вы пытаетесь вернуть значение синхронно из API, который является асинхронным. Это не очень хорошая идея. Вы должны обрабатывать API-интерфейсы асинхронно, как и предполагалось.

Быстрое решение этой проблемы - использовать значение вашей переменной dist только внутри метода onLocationResult(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого post , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

...