在方法外传递值

Pass the value outside of a method

我已将位置源和目标声明为全局变量。但是尽管我没有在 dist 中获得正确的价值。我应该如何传递 geoFire.getLocation() 方法之外的位置值?或者我如何通过 geofire 获得两个地理位置之间的距离?

我试过将源和目标设为静态。但是没用。

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;

}

Firebase APIs 是异步的,这意味着 onLocationResult() 方法 returns 在它被调用后立即执行,并且任务 returns 的回调将是一段时间后打电话。无法保证需要多长时间,可能需要几百毫秒到几秒才能获得数据。

因为该方法 returns,您尝试 return 作为方法结果的 dist 变量的值不会从尚未回调

基本上,您正在尝试从异步的 API 中同步 return 一个值。那不是一个好主意。您应该按预期异步处理 APIs。

一个快速解决这个问题的方法是只在 onLocationResult() 方法中使用你的 dist 变量的值,否则我建议你从这个 in which I have explained how it can be done using a custom callback. You can also take a look at this video 为了更好的理解。