3

J'ai 2 Activity savoirLiveData pas la mise à jour des données d'une activité à une autre activité - Android

  1. Liste Activity
  2. Détail Activity

La liste Activity montre la liste des articles et des détails Activity est- montré en cliquant sur un élément de la liste. Dans le ListActivity, nous observons l'extraction des flux à partir de la base de données et une fois que nous le faisons, nous mettons à jour l'interface utilisateur.

page Liste

feedViewModel.getFeeds().observe(this, Observer { feeds -> 
     feeds?.apply { 
      feedAdapter.swap(feeds) 
      feedAdapter.notifyDataSetChanged() 
     } 
}) 

Maintenant, nous avons une page DetailActivity qui met à jour l'alimentation (point) et Activity est terminé, mais les modifications ne sont pas dans le ListActivity.

Détails Page

override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     feedViewModel.setFeedId(id) 
     feedViewModel.updateFeed() 
} 

Mode Modèle

class FeedViewModel(application: Application) : AndroidViewModel(application) { 


    private val feedRepository = FeedRepository(FeedService.create(getToken(getApplication())), 
      DatabaseCreator(application).database.feedDao()) 

    /** 
    * Holds the id of the feed 
    */ 
    private val feedId: MutableLiveData<Long> = MutableLiveData() 

    /** 
    * Complete list of feeds 
    */ 
    private var feeds: LiveData<Resource<List<Feed>>> = MutableLiveData() 

    /** 
    * Particular feed based upon the live feed id 
    */ 
    private var feed: LiveData<Resource<Feed>> 

    init { 
     feeds = feedRepository.feeds 
     feed = Transformations.switchMap(feedId) { id -> 
      feedRepository.getFeed(id) 
     } 
    } 

    /** 
    * Get list of feeds 
    */ 
    fun getFeeds() = feeds 

    fun setFeedId(id: Long) { 
     feedId.value = id 
    } 

    /** 
    * Update the feed 
    */ 
    fun updateFeed() { 
     feedRepository.updateFeed() 
    } 

    /** 
    * Get feed based upon the feed id 
    */ 
    fun getFeed(): LiveData<Resource<Feed>> { 
     return feed 
    } 

} 

Pour des raisons de simplicité du code a été abstraire. Si nécessaire, je peux les ajouter pour tracer le problème

Répondre

4

Après beaucoup d'enquête et une idée de this answer d'une autre question. J'ai compris le problème.

Problème

Le DatabaseCreator(application).database.feedDao() n'a pas été la création d'instance de votre base de données en raison de laquelle la première Activity avait une autre instance où LiveData écoutait les changements et 2ème Activity avait une autre instance où, après la mise à jour des données, le rappel a été ignoré.

Solution

utilisation Poignard ou tout autre injection de dépendance pour assurer que seule instance de base de données et DAO est créé.

+0

J'ai exactement le même problème, mais j'ai annoté l'instance de la DB et les DAO comme singletons. Qu'avez-vous changé? En passant, j'utilise Dagger 2. Si vous voulez plus d'informations, voici la question que j'ai posté: https://stackoverflow.com/questions/48267724/view-not-updating-after-first-time-triggering -livedata-when-using-background-job –

0

Je faisais face à ce même problème sur plusieurs activités pour les mêmes entités. M'a été utile pour coder la chambre base de données par exemple comme Singleton, comme: this (step 5)

Exemple:

public abstract class MyDatabase extends RoomDatabase { 
    private static MyDatabase mMyDatabase; 
    public static MyDatabase getInstance(Context context) { 
     if(mMyDatabase==null){ 
      mMyDatabase = Room.databaseBuilder(context.getApplicationContext(), MyDatabase.class, "app_database").build(); 
      return mMyDatabase; 
     } 
    } 
} 

Et dans tous les ViewModel que vous avez (classe va de AndroidViewModel pour le paramètre de contexte):

public MyViewModel(@NonNull Application application) { 
     super(application); 
     mMyDatabase = MyDatabase.getInstance(application.getApplicationContext()); 
} 

Maintenant, dans mon cas, chaque fois que je modifie une valeur dans les activités de configuration, il se reflète dans d'autres activités.

Espérons cette aide.