Je travaille sur une application MVVM. J'ai été capable d'utiliser AndroidViewModel, Activity et MutableLiveData ensemble, mais je ne sais pas pourquoi j'ai un problème avec cette méthode spécifique. Par exemple, j'ai un AndroidViewModel appelé "IssuesViewModel". Il dispose d'un private MutableLiveData<Boolean> mutable;
et ces deux méthodes:Erreur lors de l'observation de MutableLiveData
// 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;
}
Maintenant, dans mon « IssuesActivity », qui étend AppCompatActivity
et la mise en œuvre LifecycleRegistryOwner
, je ces méthodes:
//... 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
}
}
}
J'ai pu utilisez mutableLiveData avant (avec un objet personnalisé au lieu de booléen). J'ai fait de même pour tous mes précédents appels ... Je ne sais pas pourquoi ça ne marche pas.
Merci!
Edit 1, le 21 novembre:
Je pense que le problème est que mon activité étend AppCompatActivity
et met en œuvre LifecycleRegistryOwner
. J'ai une activité avec un code similaire à celui ci-dessus et tout fonctionne, mais cette activité s'étend LifecycleActivity
. Lorsque je change cette activité, en étendant AppCompatActivity
et en implémentant LifecycleRegistryOwner
, onChange de l'observateur ne déclenche jamais. J'ai trouvé ce bug qui est lié à mon problème, mais je pense que cela fonctionne avec Fragments ...
est le problème que sur le changement n'est pas appelé? aussi à la place de getMutable(), vous pouvez retourner le mutable sur reportIssue() au lieu de – dgngulcan
oui, pour une raison quelconque, onChanged n'est jamais appelé ... J'ai essayé de retourner mutable sur 'reportIssue()' mais je n'ai pas travaillé –
chaque fois que vous appelez 'reportIssue' la valeur de 'mutable' est définie sur une nouvelle valeur mais votre client d'activité peut utiliser l'ancienne valeur - simplement initialiser' mutable = new MutableLiveData(); 'en un seul endroit dans votre modèle de vue – pskink