首页 > 解决方案 > 创建类 viewModel 的实例时出错

问题描述

我只是想学习房间。因此,我使用 Google 在此提供的指南创建了一个示例应用程序。我收到以下错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.brahma/com.brahma.ui.SignUpActivity}: java.lang.RuntimeException: Cannot create an instance of class com.brahma.viewModel.UserViewModel
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6501)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.RuntimeException: Cannot create an instance of class com.brahma.viewModel.UserViewModel
        at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:207)
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)
        at com.brahma.ui.SignUpActivity.onCreate(SignUpActivity.java:72)
        at android.app.Activity.performCreate(Activity.java:7036)
        at android.app.Activity.performCreate(Activity.java:7027)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6501) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:199)
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134) 
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) 
        at com.brahma.ui.SignUpActivity.onCreate(SignUpActivity.java:72) 
        at android.app.Activity.performCreate(Activity.java:7036) 
        at android.app.Activity.performCreate(Activity.java:7027) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6501) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
        at android.arch.persistence.room.RoomDatabase.assertNotMainThread(RoomDatabase.java:164)
        at android.arch.persistence.room.RoomDatabase.query(RoomDatabase.java:192)
        at com.brahma.Room.UserDao_Impl.getUser(UserDao_Impl.java:56)
        at com.brahma.repository.UserRepository.<init>(UserRepository.java:18)
        at com.brahma.viewModel.UserViewModel.<init>(UserViewModel.java:17)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334) 
        at android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:199) 
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134) 
        at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) 
        at com.brahma.ui.SignUpActivity.onCreate(SignUpActivity.java:72) 
        at android.app.Activity.performCreate(Activity.java:7036) 
        at android.app.Activity.performCreate(Activity.java:7027) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6501) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

我试图在互联网上寻找解决方案,但没有成功。stackOverflow 上可用的解决方案要求将 viewModel 的构造函数公开,我的 costructor 已经是。

这是我的视图模型:

public class UserViewModel extends AndroidViewModel{

    private UserRepository mUserRepository;
    private User mUserInfo;

    public UserViewModel( Application application) {
        super(application);
        mUserRepository = new UserRepository(application);
        mUserInfo = mUserRepository.getmUserInfo();
    }


    public User getUserInfo(){
        return mUserInfo;
    }
    public void insert(User user){
        mUserRepository.insert(user);
    }
}

下面是我实例化视图模型的活动:

protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_sign_up);
        AppEventsLogger.activateApp(this, getString(R.string.facebook_app_id));
        initViews();

        mUserViewModel = ViewModelProviders.of(this).get(UserViewModel.class);

        callbackManager = CallbackManager.Factory.create();
        mGoogleSignUp.setOnClickListener(this);
        mFacebookSignUp.setOnClickListener(this);
        initGoogleApiClient();
    }

我不知道我做错了什么。

标签: androidandroid-roomandroid-viewmodel

解决方案


正如它在底部附近的调用堆栈中所说的那样,您正在主线程上调用数据库查询。

 Caused by: java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

使用 Room,您无法在 UI 线程上发出请求,我相信这是因为这条线。

mUserInfo = mUserRepository.getmUserInfo();

如果您使用的是 Room 和 ViewModel,只需使用LiveData. 最终产品也将更容易使用。


推荐阅读