android - 创建类 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();
}
我不知道我做错了什么。
解决方案
正如它在底部附近的调用堆栈中所说的那样,您正在主线程上调用数据库查询。
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
. 最终产品也将更容易使用。
推荐阅读
- javascript - HMAC sha1 签名与 x-hub-signature 标头不匹配
- python - 如何判断一个ffmpeg子进程是否掉线
- java - 使用导航组件传递数据 - 当指南不需要时,我为什么需要构造函数的值?
- java - 当流式 DataFrames/DataSets 上存在流式聚合时不支持附加输出模式而没有水印
- python - 在 imshow-plot 上绘制单个像素的方法
- react-native - 显示带有禁用标题的箭头左后退按钮
- google-apps-script - 在谷歌工作表中选中复选框时如何插入日期和时间?
- automation - 使用多个浏览器的量角器测试在启动时失败
- java - Jacoco 报告没有考虑在 Maven 中进行 Cucumber 测试
- javascript - 有没有人类用户不能使用网站的方法?