如何修复“无法创建 ViewModel 类的实例”?

2024-03-31

我尝试了 MVVM 架构,实现了所有必需的类和方法。在 MainActivity 中创建 ViewModel 类的对象时,出现此错误java.lang.RuntimeException: Cannot create an instance of class com.prathameshmore.getnotes.viewmodel.NoteViewModel.

我尝试了 YouTube 教程中的这个示例。我正确地执行了所有操作。我尝试将 ViewModel 类和构造函数公开,但应用程序仍然在运行时崩溃。

MainActivity.java

public class MainActivity extends 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

public class NoteViewModel extends 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

public class 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

E/AndroidRuntime:致命异常:main 进程:com.prathameshmore.getnotes,PID:28833 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.prathameshmore.getnotes/com.prathameshmore.getnotes.views.MainActivity}: java.lang.RuntimeException:无法创建类的实例 com.prathameshmore.getnotes.viewmodel.NoteViewModel 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2723) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 导致:java.lang.RuntimeException:无法创建类 com.prathameshmore.getnotes.viewmodel.NoteViewModel 的实例 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:208) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6868) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 引起原因:java.lang.reflect.InitationTargetException 在 java.lang.reflect.Constructor.newInstance0(本机方法) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:430) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6868) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 原因:java.lang.RuntimeException:找不到 com.prathameshmore.getnotes.database.NoteDatabase 的实现。 注意Database_Impl不存在 在 androidx.room.Room.getGenerateImplementation(Room.java:94) 在 androidx.room.RoomDatabase$Builder.build(RoomDatabase.java:851) 在 com.prathameshmore.getnotes.database.NoteDatabase.getInstance(NoteDatabase.java:31) 在 com.prathameshmore.getnotes.repository.NoteRepository。(NoteRepository.java:20) 在 com.prathameshmore.getnotes.viewmodel.NoteViewModel.(NoteViewModel.java:21) 在 java.lang.reflect.Constructor.newInstance0(本机方法) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:430) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103) 在 com.prathameshmore.getnotes.views.MainActivity.onCreate(MainActivity.java:25) 在 android.app.Activity.performCreate(Activity.java:6868) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2676) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2784) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1523) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6238) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 申请终止。


你需要有一个工厂类ViewModel.

public class MyViewModelFactory implements ViewModelProvider.Factory {
    private Application mApplication;
    private String mParam;


    public MyViewModelFactory(Application application, String param) {
        mApplication = application;
        mParam = param;
    }


    @Override
    public <T extends ViewModel> T create(Class<T> modelClass) {
        return (T) new MyViewModel(mApplication, mParam);
    }
}

当实例化视图模型时,你会这样做:

MyViewModel myViewModel = ViewModelProviders.of(this, new MyViewModelFactory(this.getApplication(), "my awesome param")).get(MyViewModel.class);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复“无法创建 ViewModel 类的实例”? 的相关文章

随机推荐

  • 当应用程序在 Docker 容器中运行时,Swagger UI 给出 ​​404

    在我的项目中 我在 Startup cs 中使用 Swashbuckle 设置了 Swagger public void ConfigureServices IServiceCollection services services AddS
  • Node js中response.send和response.write的区别

    我编写了一个使用 Node js restify 框架的小型 API 该 API 接收请求 实际上是 之后的任何内容 然后将该请求发送到另一台服务器 从服务器获取响应并将响应传递回原始请求源 对于这个 API 我同时使用 Restify 服
  • 使用 dplyr 获取方差为零的列名称

    我试图找到数据中方差为零的任何变量 即恒定连续变量 我想出了如何使用 lapply 来做到这一点 但我想使用 dplyr 因为我试图遵循整洁的数据原则 我可以使用 dplyr 创建一个仅包含方差的向量 但在最后一步我发现值不等于零并返回令我
  • 使用 Powershell Windows 窗体将复选框添加到列表框

    我正在根据我之前的帖子创建一个新问题 在 Powershell Winforms 中更改单个列表框项目的颜色 https stackoverflow com questions 27405945 change the color of in
  • TravisCI 中的 NDK、CMake 和 Android

    我正在尝试为使用一些 C 代码的 Android 项目设置 CI 因此 我需要 Travis Android 映像上未预安装的 NDK 我目前正在通过自己拉动 NDK 来实现这一目标 但是我的 CI 盒子抱怨 CMake 许可证不被接受 奇
  • 具有两列的 LISTAGG 函数

    我有一张这样的桌子 报告 user id Department Position Record id 1 Science Professor 1001 1 Maths 1002 1 History Teacher 1003 2 Scienc
  • 几秒钟后更改 ImageView

    我正在尝试实现一个简单的活动 让用户插入密码 我有一个 gridview 其中包含 9 个要使用的图像和 4 个将作为所选图像的图像视图 单击 gridview 上的项目时 相应的图像将填充所选图像 现在的问题是 我希望 4 个图像视图的行
  • 如何在 Laravel 中设置会话超时?

    是否有一种固有的方法可以将会话设置为在特定时间后过期 我当前的设置似乎将在 30 分钟后过期 我想禁用它或至少增加它 但我在 Laravel 中找不到可以设置此设置的任何位置 In app config session php你有 life
  • 从 Rails 3 控制器返回的凌乱的视图

    在我的 Rails 3 应用程序控制器上 我有以下代码 array Location all each x array lt
  • JavaScript 中有类似 C# 区域的东西吗?视觉工作室 2017

    我正在为一些人工作 他们希望将自己的 JavaScript 库组织成不同的类别 CRUD 函数 表单函数等 他们真的很喜欢 C 中区域的实用性 并且在 JavaScript 文件中要求这样做 有什么建议么 我正在使用 Visual Stud
  • 从 php 标头下载的 Mp3 文件不起作用

    你好呀 好的 事情就这样了 我的服务器上有我的 mp3 文件 每个文件都在其自己的文件夹中 该文件夹中有 mp3 和一个包含以下脚本的 php 文件 问题是 当我点击进入该 php 页面时 标头应该会自动下载 mp3 文件 但当它下载时 它
  • 由于意外的编码更改,Visual Studio 2008 项目文件无法加载

    在我们的团队中 我们在 Visual Studio 2008 中有一个数据库项目 该项目由 Team Foundation Server 进行源代码控制 每隔两周左右 一位同事签入后 项目文件将无法加载到其他开发人员的计算机上 错误信息是
  • MVC @import html 关键字

    我正在尝试使用 但 mvc 在 razor 视图中将其视为 net 代码 CS0103 名称 导入 在当前上下文中不存在 我如何解决它 谢谢 双倍 解决这个问题 更多详情请点击这里 http weblogs asp net scottgu
  • Maven groovy 编译失败且未解释原因

    I run mvn clean compile 并得到以下输出 INFO Scanning for projects INFO INFO INFO Building tendiwa core 1 0 SNAPSHOT INFO INFO I
  • Sais.js 对套接字请求的授权

    我正在尝试构建一个基于 sails js 的聊天应用程序 来自特定聊天的消息的 URL 如下所示 api chat id messages 当我使用 XHR 请求此 url 时 它会提供一个会话 cookie 并且 sails js 会构建
  • 使用和不使用“New”关键字定义数组有什么区别? [复制]

    这个问题在这里已经有答案了 看看这两个简单的程序 方案一 public class GenArray extends Applet byte myArray byte M byte o byte d byte e byte 1 方案2 pu
  • 不同的产品风格是否可以有不同的 build.gradle ?

    我正在工作的项目是为基于 Amazon 的设备以及 Android 构建的 几乎 95 的代码库在这两者之间是通用的 因此 我没有将这两个项目作为不同的项目 而是考虑使用产品风味将这两个项目放在一起 请告诉我是否还有其他更好的解决方案 但我
  • 如何在柔性容器中设置间隙(排水沟)?

    我正在尝试创建某种柔性容器的通用组件 该组件由容器及其连续的子组件组成 如果一行中的孩子太多 没有足够空间的孩子会去第二行 它可以使用 Flexbox 轻松实现 但我也希望能够在元素之间设置装订线 一行的第一个和最后一个元素不应分别具有左边
  • 如何避免两个不同的线程从数据库读取相同的行(Hibernate 和 Oracle 10g)

    假设我有两个不同的线程 T1 和 T2 它们同时访问同一个数据库并从同一个表中获取数据 现在 在线程启动时 我需要从表中获取数据并将行存储到集合中 然后我将使用该集合在其他地方执行一些工作 我不希望两个线程能够处理相同的数据 因为这会导致重
  • 如何修复“无法创建 ViewModel 类的实例”?

    我尝试了 MVVM 架构 实现了所有必需的类和方法 在 MainActivity 中创建 ViewModel 类的对象时 出现此错误java lang RuntimeException Cannot create an instance o