LiveData наблюдать () не вызывается
Мой обратный вызов наблюдателя не вызывается, можете ли вы указать, что я делаю неправильно? Мое приложение действительно простое, так как я просто тестирую эту архитектуру
MainActivity код
viewModel = ViewModelProviders.of(this).get(UpcomingMoviesViewModel.class);
viewModel.getUpcomingMovies().observe(this, upcomingMovies -> {
// NOT CALLED !!!
for(UpcomingMovies movie : upcomingMovies) {
Log.d("Upcoming", "Movie - " + movie.movie.title);
}
});
Код ViewModel
private LiveData<List<UpcomingMovies>> mUpcomingMovies;
private MovieRepository movieRepository;
public UpcomingMoviesViewModel(@NonNull Application application ) {
super(application);
movieRepository = MovieRepository.getsInstance(application);
}
public LiveData<List<UpcomingMovies>> getUpcomingMovies() {
mUpcomingMovies = movieRepository.getUpcomingMovies();
return mUpcomingMovies;
}
И мой метод хранилища
public LiveData<List<UpcomingMovies>> getUpcomingMovies(){
if(movieDao.loadUpcomingMovies().getValue() == null) {
webService.getUpcomingMovies(api_key).
enqueue(new Callback<MovieResults>() {
@Override
public void onResponse(Call<MovieResults> call, Response<MovieResults> response) {
MovieResults results = response.body();
if(results == null) return;
new insertAsyncTask(movieDao).execute(results.movies.toArray(new Movie[results.movies.size()]));
}
@Override
public void onFailure(Call<MovieResults> call, Throwable t) {
Log.d("Retrofit error", t.getMessage());
}
});
}
return movieDao.loadUpcomingMovies();
}
private static class insertAsyncTask extends AsyncTask<Movie, Void, Void> {
private final MovieDao mAsyncTask;
insertAsyncTask(MovieDao dao){
mAsyncTask = dao;
}
@Override
protected Void doInBackground(Movie... movies) {
long [] results = mAsyncTask.insertMovies(Arrays.asList(movies));
long [] results2 = mAsyncTask.insertUpcomingMovies(Arrays.asList(movies));
return null;
}
}
И то и другое results
а также results2
вернуть 20 номеров, которые я приписываю тому факту, что я получаю 20 фильмов. Что я здесь не так сделал? Спасибо за ваше время
3 ответа
Решение
Реализуйте LifeCyclebserver для viewModel и добавьте это в свою деятельность:
getLifecycle().addObserver(viewModel);
Помните, что ваша модель просмотра должна иметь конструктор, который не принимает параметров
Для Java в исходном и целевом фрагментах call;
viewModel = new ViewModelProvider(getActivity()).get(YourViewModel.class);
Нет
viewModel = new ViewModelProvider(this).get(YourViewModel.class);
getActivity
вместо
this
позволяет ссылаться на одно и то же действие