MVVMアプリケーションで作業しています。私はAndroidViewModel、Activity、およびMutableLiveDataを一緒に使用することができましたが、なぜこの特定のメソッドに問題があるのかわかりません。MutableLiveDataを見ている間にエラーが発生しました
たとえば、AndroidViewModelが「IssuesViewModel」と呼ばれています。それはprivate MutableLiveData<Boolean> mutable;
と、この二つの方法があります:私はすることができました
//... Activity callbacks and other methods ...
private IssuesViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
// Toolbar code and other stuff...
viewModel = ViewModelProviders.of(this).get(IssuesViewModel.class);
// More code ...
}
@Override
public LifecycleRegistry getLifecycle() {
return new LifecycleRegistry(this);
}
// Triggered after button click
private void reportIssue(Data data){
viewModel.reportIssue(data);
viewModel.getMutable().observe(this, new Observer<Boolean>(){
@Override
public void onChanged(@Nullable Boolean response){
if (response != null && response){
//Success, update UI
} else {
//Error, update UI
}
}
}
:それはAppCompatActivity
を拡張し、LifecycleRegistryOwner
実施して、私の「IssuesActivity」で、
// Retrofit 2 call
public void reportIssue(Data data){
mutable = new MutableLiveData();
retrofit.reportIssue(Data data, new RestCallback<Void>(){
@Override
public void success(Void success){
mutable.setValue(true);
}
@Override
public void failure(){
mutable.setValue(false);
}
);
}
// Getting mutableLiveData
public MutableLiveData<Boolean> getMutable(){
return mutable;
}
今、私は、このメソッドを持っています前にmutableLiveDataを使用してください(Booleanの代わりにカスタムObjectを使用)。以前のすべての電話で同じことをしました...なぜこれが機能していないのか分かりません。
ありがとうございます!
編集1、11月21日:
私はこの問題は、私の活動がAppCompatActivity
を拡張し、LifecycleRegistryOwner
を実装していることだと思います。私は上のものと同様のコードを持つアクティビティを持っていますが、すべてが動作しますが、そのアクティビティはLifecycleActivity
に拡張されています。このアクティビティを変更すると、AppCompatActivity
を拡張してLifecycleRegistryOwner
を実装すると、オブザーバのonChange は決してをトリガしません。私はこれが私の問題に関連しているbugを見つけましたが、私はそれがちょうどフラグメントで動作すると思っています...
変更時に呼び出されないという問題はありますか?また、getMutable()の代わりに、voidの代わりにreportIssue()の代わりにmutableを返すことができます – dgngulcan
何らかの理由で、onChangedは呼び出されませんでした... 'reportIssue()'でmutableを返そうとしましたが、動作しませんでした。 –
'reportIssue'を呼び出すたびに' mutable'の値は新しい値に設定されますが、あなたのアクティビティクライアントは古い値を使用することがあります - ビューモデル内のある場所で 'mutable = new MutableLiveData();'を単に初期化します。 – pskink