Cannot create an instance of class MainViewModel_android

Viewed 72

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();
}
1 Answers

Perhaps this misstake is just from copy pasting your code here, but you seem to have syntax probems in your viewmodel.

Your class ends before the constructor. This seems to be the complete class:

public class MainViewModel extends AndroidViewModel {
    public static MovieDatabase database;
    public final LiveData<List<Movie>> movies;
}

Just remove } and perhaps add it to the end of the class, although it looks like it is not needed (but your IDE should have complained about this syntax problem?)

Related