LocationLiveData не устанавливает значение с помощью компонентов Android

Я пытаюсь использовать компоненты Android, чтобы наблюдать за изменениями местоположения.

вот мой класс LiveData:

public class LocationLiveData extends LiveData<Location> implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener,
    LocationListener {
  private GoogleApiClient googleApiClient;
  public LocationLiveData(Context context) {
    googleApiClient =
        new GoogleApiClient.Builder(context, this, this)
            .addApi(LocationServices.API)
            .build();
  }
  @Override
  protected void onActive() {
    // Wait for the GoogleApiClient to be connected
    googleApiClient.connect();
  }
  @Override
  protected void onInactive() {
    if (googleApiClient.isConnected()) {
      LocationServices.FusedLocationApi.removeLocationUpdates(
          googleApiClient, this);
    }
    googleApiClient.disconnect();
  }
  @SuppressLint("MissingPermission")
  @Override
  public void onConnected(Bundle connectionHint) {
    // Try to immediately find a location
    Location lastLocation = LocationServices.FusedLocationApi
        .getLastLocation(googleApiClient);
    if (lastLocation != null) {
      setValue(lastLocation);
    }
    // Request updates if there’s someone observing
    if (hasActiveObservers()) {
      LocationServices.FusedLocationApi.requestLocationUpdates(
          googleApiClient, new LocationRequest(), this);
    }
  }
  @Override
  public void onLocationChanged(Location location) {
    // Deliver the location changes
    setValue(location);
  }
  @Override
  public void onConnectionSuspended(int cause) {
    // Cry softly, hope it comes back on its own
  }
  @Override
  public void onConnectionFailed(
      @NonNull ConnectionResult connectionResult) {
    // Consider exposing this state as described here:
    // https://d.android.com/topic/libraries/architecture/guide.html#addendum
  }
}

Вот моя ViewModel:

public class  LocationViewModel extends ViewModel {
  private MutableLiveData<LocationLiveData> currentLocation;

  public MutableLiveData<LocationLiveData> getCurrentLocation(){
    if(currentLocation==null){
      currentLocation = new MutableLiveData<>();
    }
    return currentLocation;
  }
}

Но всякий раз, когда я вызываю этот путь:

locationViewModel = ViewModelProviders.of(this).get(LocationViewModel.class);

    // Create the observer which updates the UI.
    locationViewModel.getCurrentLocation().observe(this, new Observer<LocationLiveData>() {
      @Override
      public void onChanged(@Nullable LocationLiveData locationLiveData) {
        if(locationLiveData!=null)
        displayCurrentLocationMarker(locationLiveData.getValue());
      }
    });

Но сам конструктор LocationLiveData не вызывается. Может ли кто-нибудь помочь мне в этом отношении?

1 ответ

Вам нужно позвонить LocationLiveData из LifecycleObserver (Деятельность или фрагмент), как это:

class MyActivity extends AppCompatActivity {

    @Override
    public void onCreate(...) {
        //...

        new LocationLiveData(this).observe(this, location -> {
            // update UI
        });
    }

Вы также можете найти более простой LocationLiveData в Котлине, используя последние API определения местоположения сервисов Google Play на этой странице:

https://gist.github.com/Gnzlt/d711f30207e08e5ea3a04b08a7aaef6f