Почему я получаю исключение NullPointerException с FusedLocationProviderClient при использовании свойств из другого класса - PullRequest
0 голосов
/ 23 декабря 2018

Извините за основной вопрос, но сейчас я изучаю программирование Android.

Я использую GoogleFusedProviderClient, чтобы получить местоположение приложения из пользовательского класса.Я поместил это в класс, поскольку мне нужно назвать это от нескольких действий.

класс Fast:

public class fas {
    // get the context from the Activity that uses this class
    private Context context;
    // Vars to store GPS info
    public Double latitude, longitude;
    public Float accuracy;

    private FusedLocationProviderClient flpc;

    fas_functions(Context context) {
        this.context = context;
    }

    public void getAppLocation() {
        flpc = LocationServices.getFusedLocationProviderClient(context);

        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // Already forced user to enable location
            return;
        }

        flpc.getLastLocation().addOnSuccessListener((Activity) context, 
        new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                if (location != null) {
                    latitude = location.getLatitude();
                    longitude = location.getLongitude();
                    accuracy = location.getAccuracy();
                } else {
                    // No position so request an immediate one
                    startListener();
                }
            }
        });
}

В своей деятельности я вызываю getAppLocation (), чтобы получить местоположение, а затем пытаюсь использовать Fas.latitude и Fas.longitude.Это где я получаю исключение нулевого указателя и не понимаю причину.

Активность:

public class Activity extends AppCompatActivity {
    .......

    // Import Class fas_functions
    fas_functions Fas = new fas_functions(this);

    ........

    private void function check_loc() {
      Fas.getAppLocation();

      // This will return null and if I use this in Volley for example it will throw a NullPointerException
      System.out.println(Fas.latitude);
   }

1 Ответ

0 голосов
/ 23 декабря 2018

Поскольку OnSuccessListener является асинхронным, печать широты будет выполняться до выполнения onSuccess, вам необходимо использовать обратные вызовы.

 new OnSuccessListener<Location>() {
        @Override
        public void onSuccess(Location location) {
            if (location != null) {
                onLocationLoadedListener.onLocationLoaded(location);
            } else {
                // No position so request an immediate one
                startListener();
            }
        }
    });

    private onLocationLoadedListener onLocationLoadedListener;

    public void setOnLocationLoadedListener(fas.onLocationLoadedListener onLocationLoadedListener) {
        this.onLocationLoadedListener = onLocationLoadedListener;
    }

    public interface onLocationLoadedListener{
    void onLocationLoaded(Location location);
}

и:

private void function check_loc() {
            Fas.getAppLocation();
            fas.setOnLocationLoadedListener(new fas.onLocationLoadedListener() {
                @Override
                public void onLocationLoaded(Location location) {
                    System.out.println(location.latitude);
                }
            });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...