ho provato le mani sull'architettura MVVM, ho implementato tutte le classi e i metodi richiesti. durante la creazione di un oggetto della classe ViewModel in MainActivity, ho ricevuto questo errore java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel
.
ho provato questo esempio da un tutorial di YouTube. ho fatto tutta l'implementazione corretta. ho provato a fare classe ViewModel e costruttore pubblico, ma ancora, app crash a runtime.
MainActivity.java
'la classe pubblica MainActivity estende AppCompatActivity {
private NoteViewModel noteViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); noteViewModel = ViewModelProviders.of(this).get(NoteViewModel.class); noteViewModel.getAllNotes().observe(this, new Observer<List<Note>>() { @Override public void onChanged(List<Note> notes) { Toast.makeText(MainActivity.this, "Updated", Toast.LENGTH_SHORT).show(); } }); }
} '}'
NoteViewModel.java
'la classe pubblica NoteViewModel estende AndroidViewModel {
private NoteRepository noteRepository; private LiveData<List<Note>> allNotes; public NoteViewModel(@NonNull Application application) { super(application); noteRepository = new NoteRepository(application); allNotes = noteRepository.getAllNotes(); } public void insert(Note note) { noteRepository.insert(note); } public void update(Note note) { noteRepository.update(note); } public void delete(Note note) { noteRepository.delete(note); } public void deleteAllNotes() { noteRepository.deleteAllNotes(); } public LiveData<List<Note>> getAllNotes() { return allNotes; }
} '}'
NoteRepository.java
'classe pubblica NoteRepository {
private NoteDao noteDao; private LiveData<List<Note>> allNotes; public NoteRepository(Application application) { NoteDatabase database = NoteDatabase.getInstance(application); noteDao = database.noteDao(); allNotes = noteDao.getAllNotes(); } public void insert(Note note){ new InsertNoteAsyncTask(noteDao).execute(note); } public void delete(Note note) { new DeleteNoteAsyncTask(noteDao).execute(note); } public void update(Note note) { new UpdateNoteAsyncTask(noteDao).execute(note); } public void deleteAllNotes() { new DeleteAllNotesAsyncTask(noteDao).execute(); } public LiveData<List<Note>> getAllNotes() { return allNotes; } private static class InsertNoteAsyncTask extends AsyncTask<Note, Void, Void> { private NoteDao noteDao; private InsertNoteAsyncTask(NoteDao noteDao) { this.noteDao = noteDao; } @Override protected Void doInBackground(Note...notes) { noteDao.insert(notes[0]); return null; } } private static class UpdateNoteAsyncTask extends AsyncTask<Note, Void, Void> { private NoteDao noteDao; private UpdateNoteAsyncTask(NoteDao noteDao) { this.noteDao = noteDao; } @Override protected Void doInBackground(Note...notes) { noteDao.update(notes[0]); return null; } } private static class DeleteNoteAsyncTask extends AsyncTask<Note, Void, Void> { private NoteDao noteDao; private DeleteNoteAsyncTask(NoteDao noteDao) { this.noteDao = noteDao; } @Override protected Void doInBackground(Note...notes) { noteDao.delete(notes[0]); return null; } } private static class DeleteAllNotesAsyncTask extends AsyncTask<Void, Void, Void> { private NoteDao noteDao; private DeleteAllNotesAsyncTask(NoteDao noteDao) { this.noteDao = noteDao; } @Override protected Void doInBackground(Void...voids) { noteDao.deleteAllNotes(); return null; } }
} '}'
log log log
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.prathameshmore.getnotes, PID: 28833
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.prathameshmore.getnotes/com.prathameshmore.getnotes.views.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2723)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6238)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
at com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25)
at android.app.Activity.performCreate(Activity.java:6868)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6238)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
at com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25)
at android.app.Activity.performCreate(Activity.java:6868)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6238)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
Caused by: java.lang.RuntimeException: cannot find implementation for com.prathameshmore.getnotes.database.NoteDatabase. NoteDatabase_Impl does not exist
at androidx.room.Room.getGeneratedImplementation(Room.java:94)
at androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:851)
at com.prathameshmore.getnotes.database.NoteDatabase.getInstance(NoteDatabase.java:31)
at com.prathameshmore.getnotes.repository.NoteRepository.<init>(NoteRepository.java:20)
at com.prathameshmore.getnotes.viewmodel.NoteViewModel.<init>(NoteViewModel.java:21)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
at com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25)
at android.app.Activity.performCreate(Activity.java:6868)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6238)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
Application terminated.
En title : How to fix 'Cannot create an instance of ViewModel class'?
Caused by: java.lang.RuntimeException: cannot find implementation for com.prathameshmore.getnotes.database.NoteDatabase. NoteDatabase_Impl does not exist
è necessario avere una classe di fabbrica per il vostro
ViewModel
.e quando instantiamo il modello di vista, ti piace questo:
AndroidViewModelFactory
che si ottiene per impostazione predefinita è sufficiente per unAndroidViewModel
costruttore, non è necessario una fabbrica personalizzata per questo.ViewModelFactory