Ответ 1
Создайте свой конструктор public
.
Я пытаюсь написать пример приложения с использованием компонентов архитектуры 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());
}
}
});
}
}
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;
}
}
Создайте свой конструктор public
.
Убедитесь, что ваш 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 и содержал репозиторий в качестве параметра. Создание дополнительного конструктора, который был пуст без каких-либо параметров и публично решил проблему.
i.e., в вашем случае
public PostViewModel() {}
Сделать класс и конструктор общедоступными, он решил мою проблему.
Есть несколько причин, чтобы бросить исключение. Я упомянул некоторые из них..
Убедитесь, что ваш конструктор класса модели представления является общедоступным
Убедитесь, что вы добавили зависимость в свой файл gridle для жизненного цикла, даже если вы используете комнату и другие библиотеки, которые вы добавили.
Если вы использовали viewmodel внутри своей активности, убедитесь, что ваша активность расширяет "DaggerAppCompatActivity" или нет
Например
public class UserComments extends AppCompatActivity
изменить это на
public class UserComments extends DaggerAppCompatActivity
Я получил это после перехода на AndroidX.
В androidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01
есть ошибка 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)
Расширьте AndroidViewModel из вашего класса ViewModel.
public class YourViewModel extends AndroidViewModel {
public YourViewModel(Application application) {
super(application);
//Todo: ...
}
}
если ваш класс PostViewModel является внутренним классом, убедитесь, что он открытый и статический
Сделайте свой класс и конструктор общедоступными.
Я использую этот пример Android-arcuitecture-component BasicSample, чтобы создать новый проект с аналогичным журналом ошибок и обнаружил, что я не изменил имя приложения.
AndroidManifest.xml
и это была моя ошибка, чтобы исправить, поставьте имя aplicacion в de BasicApp, этот класс реализован в примере.
...
<application
android:name=".BasicApp"
android:allowBackup="false"
В моем случае мне нужно было использовать ListItemViewModelFactory для передачи параметра в мою модель представления.
Создание дополнительного конструктора, который был пустым без параметров и общедоступным, решил проблему.