Duna
Duna

Reputation: 1612

Android ViewModel observer never gets called

I am having the following code:

public class ViewModelDrivers extends ViewModel {
    private MutableLiveData<List<DriverDetailsModel>> drivers;

    public LiveData<List<DriverDetailsModel>> getDrivers() {
        if (drivers == null) {
            drivers = new MutableLiveData<>();
            loadDrivers();
        }
        return drivers;
    }

    private void loadDrivers() {
        CloudFactory.getInstance().getAllServerDrivers(PreferenceUtils.getInstance().getDeviceId(), new IServerAllTrucksCallback() {
            @Override
            public void onAllTrucks(List<DriverDetailsModel> d) {
                drivers.setValue(d);
            }
        });
    }
}

And the MainActivity on onCreate method:

    ViewModelDrivers model = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(ViewModelDrivers.class);

        model.getDrivers().observe(this, items -> {
//here never gets called. Why?
});

I didnt used ViewModelProviders since is deprecated. I never received a result in observe() method. Moreover drivers.setValue(d); gets set

Upvotes: 0

Views: 303

Answers (2)

mmmatey
mmmatey

Reputation: 684

Change drivers.setValue() to drivers.postValue( and if this helps, then you should change your code like Suraj Vaishnav defined, calling loadDrivers after subscribing to observer.

Upvotes: 1

Suraj Vaishnav
Suraj Vaishnav

Reputation: 8305

Maybe your drivers.setValue(d); called before return drivers; So remove loadDrivers(); from getDrivers() method, like this:

 public LiveData<List<DriverDetailsModel>> getDrivers() {
        if (drivers == null) {
            drivers = new MutableLiveData<>();
        }
        return drivers;
    }

And call loadDrivers() from after setting observer, like this:

model.getDrivers().observe(this, items -> {
//here never gets called. Why?
});
loadDrivers(); //here call loadDrivers();

Upvotes: 1

Related Questions