Armands9186
Armands9186

Reputation: 130

Live Data is not updating ViewModel

I am observing my viewmodel in an Activity:

private void setupViewModel() {
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    mSortCategory = sharedPreferences.getString(getString(R.string.pref_sort_key), getString(R.string.pref_sort_popular));
    MainViewModelFactory factory = new MainViewModelFactory(mSortCategory);
    mViewModel = ViewModelProviders.of(this, factory).get(MainViewModel.class);
    mViewModel.getResponse().observe(this, new Observer<MovieResponse>() {
        @Override
        public void onChanged(MovieResponse movieResponse) {
            mMovieAdapter.setData(movieResponse.getResults());
            mCurrentPage = movieResponse.getPage();
            mTotalPages = movieResponse.getTotalPages();
            Log.d(TAG, "setupviewmodel: " + movieResponse.getResults().get(0).getOriginalTitle());
        }
    });

and here is my VM:

public class MainViewModel extends ViewModel {
private MutableLiveData<MovieResponse> mMoviesResponseLiveData;

public MainViewModel(String category) {
    mMoviesResponseLiveData = Repository.getInstance().loadMoviesFromApi(category, 1);
}

public void loadMovies(String category, int currentPage) {
    mMoviesResponseLiveData = Repository.getInstance().loadMoviesFromApi(category, currentPage);
}

public MutableLiveData<MovieResponse> getResponse() {
    return mMoviesResponseLiveData;
}

and here I make a call to retrofit:

 public MutableLiveData<MovieResponse> loadMoviesFromApi(String sort, int page) {
    final MutableLiveData<MovieResponse> data = new MutableLiveData<>();
    Call<MovieResponse> call = mApiService.getMoviesResponse(sort, BuildConfig.OPEN_WEATHER_MAP_API_KEY, page);
    Log.d(TAG, "loadMoviesFromApi: " + call.request().url().toString());
    call.enqueue(new Callback<MovieResponse>() {
        @Override
        public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
            if (response.isSuccessful()) {
                data.setValue(response.body());
            }
        }
        @Override
        public void onFailure(Call<MovieResponse> call, Throwable t) {
            t.printStackTrace();
        }
    });
    return data;
}

As I understand new data should be asynchronously loaded by calling a method from activity on Viewmodel :

private void updateUI() {
    mViewModel.loadMovies(mSortCategory, mCurrentPage);
}

I receive data from retrofit. but for some reason Livedata is not being observed.

Upvotes: 0

Views: 360

Answers (1)

Ernest Zamelczyk
Ernest Zamelczyk

Reputation: 2817

Your observer isn't notified because of this method:

public void loadMovies(String category, int currentPage) {
    mMoviesResponseLiveData = Repository.getInstance().loadMoviesFromApi(category, currentPage);
}

loadMoviesFromApi returns a new instance of LiveData so the LiveData returned from getResponse is no longer referenced by your viewModel. If you want your observer to be notified you should return the ViewModel from method loadMovies and observe it or invoke mMoviesResponseLiveData.postValue(responseFromRetrofit)

Upvotes: 1

Related Questions