无法创建 AndroidViewModel 子类的实例

Posted

技术标签:

【中文标题】无法创建 AndroidViewModel 子类的实例【英文标题】:Cannot create an instance of subclass of AndroidViewModel 【发布时间】:2019-02-22 22:52:09 【问题描述】:

我的 ViewModel 类在 Java 中,而我的 Activity 类在 Kotlin 中。我收到错误

09-18 14:01:32.737 14082-1​​4082/com.meme.archcompwordlist E/androidRuntime:致命异常:主进程: com.meme.archcompwordlist,PID:14082 java.lang.RuntimeException: 无法开始活动 组件信息com.meme.archcompwordlist/com.meme.archcompwordlist.MainActivity: java.lang.RuntimeException:无法创建类的实例 com.meme.archcompwordlist.WordViewModel 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:java.lang.RuntimeException:无法创建实例 com.meme.archcompwordlist.WordViewModel 类 在 android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:207) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) 在 com.meme.archcompwordlist.MainActivity.onCreate(MainActivity.kt:37) 在 android.app.Activity.performCreate(Activity.java:6679) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Constructor.newInstance0(本机方法) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:430) 在 android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:199) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) 在 com.meme.archcompwordlist.MainActivity.onCreate(MainActivity.kt:37) 在 android.app.Activity.performCreate(Activity.java:6679) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:java.lang.RuntimeException:找不到实现 com.meme.archcompwordlist.room.WordRoomDatabase。 WordRoomDatabase_Impl 不存在 在 android.arch.persistence.room.Room.getGeneratedImplementation(Room.java:93) 在 android.arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.java:630) 在 com.meme.archcompwordlist.room.WordRoomDatabase.getRoomDatabase(WordRoomDatabase.java:22) 在 com.meme.archcompwordlist.WordRepository.(WordRepository.java:21) 在 com.meme.archcompwordlist.WordViewModel.(WordViewModel.java:22) 在 java.lang.reflect.Constructor.newInstance0(本机方法) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:430) 在 android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:199) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) 在 com.meme.archcompwordlist.MainActivity.onCreate(MainActivity.kt:37) 在 android.app.Activity.performCreate(Activity.java:6679) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

这是我的 AndroidViewModel 类

public class WordViewModel extends AndroidViewModel 

    private WordRepository repository;

    private LiveData<List<WordEntity>> allWords;

    public WordViewModel(Application application)
        super(application);
        repository = new WordRepository(application);
        allWords = repository.getAllWords();
    

    public LiveData<List<WordEntity>> getAllWords()
        return allWords;
    

    public void insert(WordEntity word)
        repository.insert(word);
    

    public void deleteAllWords() 
        repository.deleteAllWords();
    

这是我的活动课

class MainActivity : AppCompatActivity() 

    private lateinit var wordViewModel:WordViewModel
    private lateinit var newWord:EditText
    private lateinit var recyclerView:RecyclerView
    private lateinit var adapter:WordAdapter


    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        adapter= WordAdapter()
        recyclerView= findViewById<RecyclerView>(R.id.wordList)
        recyclerView.adapter=adapter

        //establish a connection to the current ViewModel
        wordViewModel= ViewModelProviders.of(this).get(WordViewModel::class.java)

        newWord = findViewById<EditText>(R.id.insertWord);
        findViewById<Button>(R.id.submitWord).setOnClickListener 
             fun onClick(v:View?)
                if(!TextUtils.isEmpty(newWord.getText()))
                    wordViewModel.insert(WordEntity(newWord.getText().toString()))
                
            
        
        findViewById<Button>(R.id.deleteWords).setOnClickListener
            fun onClick(v:View?)
                wordViewModel.deleteAllWords()
            
        


        wordViewModel.getAllWords().observe(this,Observer<List<WordEntity>>()
            fun onChanged(words:List<WordEntity>)
            adapter.setWords(words)
        
        )

    


有人可以帮我找出我做错了什么吗?在离开 Android 很长时间后,我正在尝试学习架构组件。我不完全清楚如何进行。

【问题讨论】:

你会粘贴发生崩溃的logcat吗?不只是一行错误?谢谢。但是我怀疑这可能会导致问题:public WordViewModel(Application application) 发布了整个错误。 该错误似乎与 ViewModel 无关:Caused by: java.lang.RuntimeException: cannot find implementation for com.meme.archcompwordlist.room.WordRoomDatabase. WordRoomDatabase_Impl 是的,谢谢。我很好奇你为什么要整个跟踪,所以更深入地研究可怕的东西,发现我需要一些 gradle 依赖项才能启动:annotationProcessor "android.arch.persistence.room:compiler:$lifecycle_version" kapt "android .arch.persistence.room:compiler:$lifecycle_version" 我的代码现在处于更好的状态 【参考方案1】:

我遇到了同样的问题,并从blog 中找到了解决方案。

您应该将ViewModelProvider.AndroidViewModelFactory 传递给ViewModelProvider,如下所示:

WordViewModel model = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(WordViewModel.class);


【讨论】:

以上是关于无法创建 AndroidViewModel 子类的实例的主要内容,如果未能解决你的问题,请参考以下文章

创建 ViewModel 或 AndroidViewModel 的方法

如何为 AndroidViewModel 创建视图模型工厂?

Cannot create an instance of class AndroidViewModel (androidx ViewModelProvider AndroidViewModel)

Cannot create an instance of class AndroidViewModel (androidx ViewModelProvider AndroidViewModel)

无法创建类 ViewModel kotlin 的实例

安卓基础(AndroidViewModel)