2017-10-03 4 views
0

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 ...

+0

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

+0

oui, pour une raison quelconque, onChanged n'est jamais appelé ... J'ai essayé de retourner mutable sur 'reportIssue()' mais je n'ai pas travaillé –

+0

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

Répondre

0

Ce problème a été résolu après la mise à jour android.arch.lifecycle:extensions vers la version stable 1.0.0. Maintenant, tout fonctionne comme prévu.