J'essaie d'écrire un exemple d'application en utilisant des composants d'architecture Android et même après plusieurs jours d'essais, je ne pouvais pas le faire fonctionner. Cela me donne l'exception ci-dessus.
Propriétaire du cycle de vie: -
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());
}
}
});
}
}
ViewModel: -
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;
}
}
Faites votre constructeur public
.
Assurez-vous que votre ViewModel
a un constructeur avec un seul paramètre, c'est-à-dire Application
.
exemple:
public YourViewModel(Application application) {
super(application);
...
Si vous utilisez Kotlin
, veillez à remplacer annotationProcessor
dans build.gradle
par kapt
.
Comme:
annotationProcessor "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"
Va devenir
kapt "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"
et ajouter
apply plugin: 'kotlin-kapt'
en haut du fichier buidl.gradle
.
Rendez la classe et le constructeur publics, cela a résolu mon problème.
Il y a peu de raisons de lancer l'exception. J'en ai mentionné quelques-uns ..
Assurez-vous que le constructeur de la classe de votre modèle de vue est public.
Assurez-vous que vous avez ajouté la dépendance dans votre fichier gridle pour cycle de vie aussi si vous utilisez room et autres bibliothèques que vous avez ajoutées.