Получение местоположения используя LiveData и FusedLocationProviderClient


Моя цель-получить место при запуске приложения, и если пользователь уходит и возвращается, чтобы получить обновления местоположения и все. Я беспокоюсь об удалении наблюдателя в getLocationUpdates метод.

BoundLocationManager.class

public class BoundLocationManager extends LiveData<Location> {

    private static BoundLocationManager instance;
    private FusedLocationProviderClient mFusedLocationClient;
    private LocationRequest mLocationRequest;

    public static BoundLocationManager getInstance(Context appContext) {
        if (instance == null) {
            instance = new BoundLocationManager(appContext);
        }
        return instance;
    }

    private BoundLocationManager(final Context appContext) {
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(appContext);
        createLocationRequest();
        mFusedLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() {
            @Override
            public void onComplete(@NonNull Task<Location> task) {
                if(task.isSuccessful() && task.getResult() != null) {
                    setValue(task.getResult());
                } else {
                    mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
                }
            }
        });

    }

    private void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(5000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    LocationCallback mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            for (Location location : locationResult.getLocations()) {
                if (location != null)
                    setValue(location);
            }
        }
    };

    @Override
    protected void onInactive() {
        super.onInactive();
        if (mLocationCallback != null)
            mFusedLocationClient.removeLocationUpdates(mLocationCallback);
    }

}

WeatherFragment.class

private void getLocationUpdates() {
        BoundLocationManager.getInstance(getActivity().getApplicationContext()).observe(this, new Observer<Location>() {
            @Override
            public void onChanged(@Nullable Location location) {
                if (location != null) {
                    getWeather(location.getLatitude(), location.getLongitude());
                    getAddress(location.getLatitude(), location.getLongitude());
                    BoundLocationManager.getInstance(getActivity().getApplicationContext()).removeObserver(this);
                } else
                    Toast.makeText(getActivity(), "Location is null", Toast.LENGTH_SHORT).show();
            }
        });
    }

И, наконец, я использую это:

@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION);
        else {
            getLocationUpdates();
        }
    }


881
2
задан 20 марта 2018 в 12:03 Источник Поделиться
Комментарии
1 ответ

Позвольте мне объяснить, как работать с LiveData - ViewModel и Activity.

Сейчас BoundLocationManager выглядит хорошо. Я бы рекомендовал не делать это синглтон. А также не потреблять его непосредственно в пользовательском интерфейсе (в данном случае WeatherFragment) код.

Настоятельно рекомендуется сохранить LiveData в ViewModel и ваш ViewModel обеспечит его пользовательском интерфейсе.

Также, если вы используете LiveDataтогда не беспокойтесь об удалении наблюдателя. Это делается автоматически для вас.

Дайте мне знать, если вы все еще есть некоторые запросы.

3
ответ дан 25 марта 2018 в 03:03 Источник Поделиться