I try to create instance of ViewModel, but get an error.
Process: com.example.popularmovies, PID: 20601 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.popularmovies/com.example.popularmovies.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.popularmovies.data.MainViewModel
MainActivity:
public class MainActivity extends AppCompatActivity {
private MainViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewModel = new ViewModelProvider(this).get(MainViewModel.class);
MainViewModel
public class MainViewModel extends AndroidViewModel {
public static MovieDatabase database;
public final LiveData<List<Movie>> movies;
public MainViewModel(@NonNull Application application) {
super(application);
database = MovieDatabase.getInstance(getApplication());
movies = database.movieDao().getAllMovies();
}
public Movie getMovieById(int id) {
try {
return new GetMovieTask().execute(id).get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
public void deleteAllMovies() {
new DeleteMoviesTask().execute();
}
public void insertMovie(Movie movie) {
new InsertTask().execute(movie);
}
public void deleteMovie(Movie movie) {
new DeleteTask().execute(movie);
}
public LiveData<List<Movie>> getMovies() {
return movies;
}
public static class DeleteTask extends AsyncTask<Movie, Void, Void> {
@Override
protected Void doInBackground(Movie... movies) {
if (movies != null && movies.length > 0) {
database.movieDao().deleteMovie(movies[0]);
}
return null;
}
}
public static class InsertTask extends AsyncTask<Movie, Void, Void> {
@Override
protected Void doInBackground(Movie.. movies) {
if (movies != null && movies.length > 0) {
database.movieDao().insertMovie(movies[0]);
}
return null;
}
}
public static class DeleteMoviesTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void.. integers) {
database.movieDao().deleteAllMovies();
return null;
}
}
public static class GetMovieTask extends AsyncTask<Integer, Void, Movie> {
@Override
protected Movie doInBackground(Integer.. integers) {
if (integers != null && integers.length > 0) {
return database.movieDao().getMovieById(integers[0]);
}
return null;
}
}
}
DataBase:
@Database(entities = {Movie.class}, version = 1, exportSchema = false)
public abstract class MovieDatabase extends RoomDatabase {
private static final String DB_NAME = "movies.db";
private static MovieDatabase database;
private static final Object LOCK = new Object();
public static MovieDatabase getInstance(Context context) {
synchronized (LOCK) {
if (database == null) {
database = Room.databaseBuilder(context, MovieDatabase.class, DB_NAME).build();
}
}
return database;
}
public abstract MovieDao movieDao();
}