android / codelab-android-room-with-a-view

Apache License 2.0
752 stars 490 forks source link

Can't start ViewModel #166

Open STProgrammer opened 3 years ago

STProgrammer commented 3 years ago

I just dowloaded the whole code as zip file and imported as a project on Android Studio.

I have Android Studion 4.1.3

The app close right after start and I get following error from logcat

03/23 17:34:47: Launching 'app' on Pixel_3a_API_30_x86. Install successfully finished in 253 ms. $ adb shell am start -n "com.example.android.roomwordssample/com.example.android.roomwordssample.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER Connected to process 12624 on device 'emulator-5554'. Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page. D/NetworkSecurityConfig: No Network Security Config specified, using platform default D/NetworkSecurityConfig: No Network Security Config specified, using platform default D/libEGL: loaded /vendor/lib/egl/libEGL_emulation.so D/libEGL: loaded /vendor/lib/egl/libGLESv1_CM_emulation.so D/libEGL: loaded /vendor/lib/egl/libGLESv2_emulation.so W/roomwordssampl: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed) W/roomwordssampl: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed) D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.roomwordssample, PID: 12624 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.roomwordssample/com.example.android.roomwordssample.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.android.roomwordssample.WordViewModel at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.android.roomwordssample.WordViewModel at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) at com.example.android.roomwordssample.MainActivity.onCreate(MainActivity.java:49) at android.app.Activity.performCreate(Activity.java:8000) at android.app.Activity.performCreate(Activity.java:7984) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:223)  at android.app.ActivityThread.main(ActivityThread.java:7656)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)  Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor at java.lang.Class.newInstance(Native Method) at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)  at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)  at com.example.android.roomwordssample.MainActivity.onCreate(MainActivity.java:49)  at android.app.Activity.performCreate(Activity.java:8000)  at android.app.Activity.performCreate(Activity.java:7984)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:223)  at android.app.ActivityThread.main(ActivityThread.java:7656)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

JamesNickel commented 3 years ago

Same here. It says in Logcat:

Caused by: java.lang.InstantiationException: java.lang.Class<com.nasimtelecom.roomwordsample.WordViewModel> has no zero argument constructor
        at java.lang.Class.newInstance(Native Method)

And there is an answer here: https://github.com/googlecodelabs/android-room-with-a-view/issues/145#issuecomment-739756244

veygard commented 3 years ago

Same here.

    mWordViewModel = new ViewModelProvider(this).get(WordViewModel.class);

Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor

edrsd commented 3 years ago

The solution is replace mWordViewModel = new ViewModelProvider(this).get(WordViewModel.class); with mWordViewModel = new ViewModelProvider(this,ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(WordViewModel.class);

after that it works

softone-as commented 3 years ago

idk what happens with adding AndroidViewModelFactory()... , can someone explain me?

chetan-tuteja commented 3 years ago

@softone-as There is some issue with appCompat 1.2.0 version of default implementation of ViewModel Providers, it is expecting a ViewModel with no constructor parameters, usually the AndroidViewModel which takes in Application as a parameter, was provided with a default factory for it.

We use ViewModelFactory as per to provide constructor parameters if any, so in this case as it is not automatically doing this, we are providing it with a factory so that it can make an instance properly. More detailed discussion can be found here.

This can be fixed by upgrading the version of appCompat. I have made a PR regarding same here.