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
には、パラメーターが1つだけのコンストラクター(Application
)があることを確認してください。
例:
public YourViewModel(Application application) {
super(application);
...
Kotlin
を使用している場合は、build.gradle
のannotationProcessor
をkapt
に置き換えてください。
好む:
annotationProcessor "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"
となります
kapt "Android.Arch.persistence.room:compiler:$rootProject.roomVersion"
そして追加
apply plugin: 'kotlin-kapt'
ファイルの上にあるbuidl.gradle
。
私には完全に明らかではありませんでしたが、このエラーが発生した場合、パブリックコンストラクターを作成して解決しました。私のコンストラクタは、Android開発者の例から派生し、パラメータとしてリポジトリを含んでいます。パラメーターなしで空である追加のコンストラクターを作成し、パブリックにすることで問題を解決しました。
つまり、あなたの場合
public PostViewModel() {}
クラスとコンストラクタを公開して、問題を解決しました。
例外をスローする理由はほとんどありません。それらのいくつかに言及しました。
ビューモデルクラスコンストラクターがパブリックであることを確認してください
ルームや追加した他のライブラリを使用する場合も、ライフサイクルのgridleファイルに依存関係を追加したことを確認してください。
AndroidXに移行した後にこれを取得しました。
Proguardがコンストラクターを削除するandroidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01
にバグがあります。
https://issuetracker.google.com/issues/112230489
2.0.0にアップグレードして修正し、必要に応じてプロガードルールを更新することを忘れないでください。
エラーメッセージは次のようになりました。
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)
アクティビティ内でビューモデルを使用した場合、アクティビティが「DaggerAppCompatActivity」を拡張しているかどうかを確認してください
例えば
public class UserComments extends AppCompatActivity
これを
public class UserComments extends DaggerAppCompatActivity
ViewModelクラスからAndroidViewModelを拡張します。
public class YourViewModel extends AndroidViewModel {
public YourViewModel(Application application) {
super(application);
//Todo: ...
}
}
パラメーターなしで空である追加のコンストラクターを作成し、パブリックにすることで問題を解決しました。
postViewModelクラスが内部クラスである場合、パブリックおよび静的であることを確認してください
私はこの例を使用しています Android-arcuitecture-component BasicSample 新しいプロジェクトを作成し、同様のエラーログに直面して、アプリケーション名を変更していないことがわかりました
AndroidManifest.xml
それが私のエラーでした。アプリ名をde BasicAppに修正するために、このクラスはこの例で実装されています。
...
<application
Android:name=".BasicApp"
Android:allowBackup="false"
私の場合、ListItemViewModelFactoryを使用して、ビューモデルにパラメーターを渡す必要がありました。