我正在尝试使用Android架构组件编写示例应用程序,但即使在尝试了几天之后我也无法使用它。它给了我以上例外。
生命周期所有者: -
public class MainActivity extends LifecycleActivity {
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.tv_user);
PostViewModel viewModel = ViewModelProviders.of(this).get(PostViewModel.class);
viewModel.loadPosts();
viewModel.getPost().observe(this, new Observer<Post>() {
@Override
public void onChanged(@Nullable Post post) {
if(post != null) {
textView.setText(post.toString());
}
}
});
}
}
视图模型: -
public class PostViewModel extends ViewModel {
private MediatorLiveData<Post> post;
private PostRepository postRepo;
PostViewModel() {
post = new MediatorLiveData<>();
postRepo = new PostRepository();
}
public LiveData<Post> loadPosts() {
post.addSource(postRepo.getPost(),
post -> this.post.setValue(post)
);
return post;
}
@NonNull
public LiveData<Post> getPost() {
return post;
}
}
让你的构造函数public
。
如果您在活动中使用了viewmodel,请检查您的活动是否扩展了“DaggerAppCompatActivity”
例如
public class UserComments extends AppCompatActivity
将此更改为
public class UserComments extends DaggerAppCompatActivity
我正在使用这个示例android-arcuitecture-component BasicSample创建一个新项目,面对类似的错误日志,发现我没有更改de applicatio name
AndroidManifest.xml中
这是我的错误,修复将aplicacion名称放到de BasicApp,这个类是在示例中实现的。
...
<application
android:name=".BasicApp"
android:allowBackup="false"
如果您的PostViewModel类是内部类,请确保它是public和static
确保你的ViewModel
只有一个参数,即Application
构造函数。
例:
public YourViewModel(Application application) {
super(application);
...
如果你正在使用Kotlin
,请确保用annotationProcessor
替换build.gradle
中的任何kapt
。
喜欢:
annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion"
会变成
kapt "android.arch.persistence.room:compiler:$rootProject.roomVersion"
并添加
apply plugin: 'kotlin-kapt'
在buidl.gradle
文件之上。
这对我来说并不是很明显,但是当得到这个错误时,我通过创建一个公共构造函数来解决它。我的构造函数源自Android Developer示例,并包含Repository作为参数。创建一个空的没有参数并使其公开的其他构造函数解决了这个问题。
即,在你的情况下
public PostViewModel() {}
使类和构造函数公开它解决了我的问题。
没有理由抛出异常。我提到了其中的一些......
迁移到AndroidX后我得到了这个。
在androidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01
中有一个错误,其中Proguard删除了构造函数。
https://issuetracker.google.com/issues/112230489
通过升级到2.0.0进行修复,并记住在需要时更新您的proguard规则。
我的错误消息如下所示:
java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:202)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
......
Caused by: java.lang.NoSuchMethodException: <init> [class android.app.Application]
at java.lang.Class.getConstructor0(Class.java:2204)
at java.lang.Class.getConstructor(Class.java:1683)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:200)
... 34 more
androidx.test.espresso.PerformException: Error performing 'single click - At Coordinates: 539, 1167 and precision: 16, 16' on view 'with id: my.test:id/button_return_to_main_menu'.
at androidx.test.espresso.PerformException$Builder.build(PerformException.java:82)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:79)
.....
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{my.custom.domain.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
从ViewModel类扩展AndroidViewModel。
public class YourViewModel extends AndroidViewModel {
public YourViewModel(Application application) {
super(application);
//Todo: ...
}
}