首页 > 解决方案 > 无法在 android 中创建 ViewModel 的实例

问题描述

您好,我是 android 新手,一直在尝试学习 MVVM,但我无法弄清楚为什么我会出错,说无法创建 viewmodel 类的实例:

这些是我得到的错误:

2020-06-29 12:30:26.293 15174-15174/com.carrot.roomdatabase E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.carrot.roomdatabase, PID: 15174
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.carrot.roomdatabase/com.carrot.roomdatabase.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.carrot.roomdatabase.ViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3388)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3527)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        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:2123)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.carrot.roomdatabase.ViewModel
        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.carrot.roomdatabase.MainActivity.onCreate(MainActivity.java:31)
        at android.app.Activity.performCreate(Activity.java:7820)
        at android.app.Activity.performCreate(Activity.java:7809)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3363)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3527) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        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:2123) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7710) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
     Caused by: java.lang.InstantiationException: java.lang.Class<com.carrot.roomdatabase.ViewModel> 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.carrot.roomdatabase.MainActivity.onCreate(MainActivity.java:31) 
        at android.app.Activity.performCreate(Activity.java:7820) 
        at android.app.Activity.performCreate(Activity.java:7809) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1318) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3363) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3527) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        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:2123) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7710) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
2020-06-29 12:30:26.304 15174-15174/? I/Process: Sending signal. PID: 15174 SIG: 9

下面是我的课

MainActivity.java 类:


public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private recycleViewAdapter adapter;
    private ViewModel viewModel;
    private List<NotesEntity> notesEntityList = new ArrayList<>();
    private FloatingActionButton btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewModel = new ViewModelProvider(this).get(ViewModel.class);
        viewModel.getAllNotes().observe(this, new Observer<List<NotesEntity>>() {
            @Override
            public void onChanged(List<NotesEntity> notesEntities) {
                Toast.makeText(MainActivity.this, "onChanged", Toast.LENGTH_SHORT).show();
                adapter.notifyDataSetChanged();
            }
        });

        btn = findViewById(R.id.floatingActionButton);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this , AddNote.class));
            }
        });
        init();
    }
    private void init(){
        adapter = new recycleViewAdapter(notesEntityList);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
}

ViewModel.java 类:

public class ViewModel extends AndroidViewModel {
    private Repository repository;
    private LiveData<List<NotesEntity>> allNotes;
    public ViewModel(@NonNull Application application) {
        super(application);
        repository = new Repository(application);
        allNotes = repository.getNotes();
    }

    public void insertThis(NotesEntity notesEntity){
        repository.Insert(notesEntity);
    }
    public void deleteThis(NotesEntity notesEntity){
        repository.Delete(notesEntity);
    }

    public LiveData<List<NotesEntity>> getAllNotes(){
        return allNotes;
    }
}

有人可以帮我弄清楚我做错了什么。谢谢你。

标签: javaandroidviewmodel

解决方案


像这样初始化 ViewModel。您还需要将 ViewModelFactory 与 ViewModelProvider 构造函数一起传递。

viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(ViewModel.class);

希望这可以帮助.......


推荐阅读