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