10

My observer callback is not being called, can you point out what am I doing wrong ? My application is really simple since I'm just testing this architecture

MainActivity code

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 code

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;
}

And my repository method

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;
    }
}

Both results and results2 return 20 numbers, which I attribute it to the fact I receive 20 movies. What have I done wrong here ? Thanks for ur time

Greggz
  • 1,873
  • 1
  • 12
  • 31

3 Answers3

2

Implement LifeCyclebserver to viewModel and add this in your activity:

getLifecycle().addObserver(viewModel);
Prashanth Verma
  • 588
  • 3
  • 11
0

Remember your viewModel needs to have a constructor that takes in no parameters

oyamo
  • 41
  • 1
  • 3
  • 2
    Not sure if that answers the question. The OP did not get a NullReferenceException, so it seems their ViewModel instantiated properly. (I'm guessing OP derived their ViewModel from `AndroidViewModel`). – S.L. Barth is on codidact.com Oct 27 '20 at 13:13
0

For Java in the source and destination fragments, call;

viewModel = new ViewModelProvider(getActivity()).get(YourViewModel.class);

Not

viewModel = new ViewModelProvider(this).get(YourViewModel.class);

getActivity instead of this allows you to reference the same activity

DPRK
  • 1
  • 1