web-dev-qa-db-fra.com

Android Composants de l'architecture ViewModel Context

J'étudie les composants d'architecture de Google pour implémenter ViewModel et LiveData sur mon application, et la documentation officielle dit que:

Remarque: Étant donné que le ViewModel survit à des instanciations spécifiques d'activités et de fragments, il ne doit jamais référencer une vue ou toute classe pouvant contenir une référence au contexte d'activité. Si le ViewModel a besoin du contexte d'application (par exemple, pour trouver un service système), il peut étendre la classe AndroidViewModel et avoir un constructeur qui reçoit l'application dans le constructeur (puisque la classe d'application étend le contexte)

Après cela, je me suis retrouvé avec un code comme ça:

public class ViewModelTest extends AndroidViewModel {

public ViewModelTest(Application application) {
    super(application);
}

public void test(){
    Prefs.getCurrentCode(getApplication());
}

Et dois-je l'instantiante normalement sur l'activité?

  val viewModel2 = ViewModelProviders.of(this).get(ViewModelTest::class.Java)
    viewModel2.test()

N'est-ce pas mauvais? Pour utiliser cette variable d'application lorsque vous avez besoin d'accéder à SharedPreferences ou à tout ce qui nécessite un contexte? Et si c'est le cas, devrais-je éviter de l'utiliser sur le ViewModel et l'utiliser uniquement sur la vue? Surtout si je veux mettre à jour un composant d'interface utilisateur avec une valeur qui a besoin d'un contexte. Je ne sais pas comment aborder ce problème et je suis ouvert à toutes suggestions.

Merci d'avance

11
julioribeiro

La classe AndroidViewModel est fournie dans le cadre du package Android.Arch.lifecycle qui fait partie des composants d'architecture d'Android. Il appelle lui-même le contexte d'application passé dans le constructeur. Le contexte d'application vit tout au long du cycle de vie de l'activité.

Un contexte d'application dans un ViewModel est correct car le contexte d'application est lié à l'ensemble du cycle de vie de l'application, par opposition à un contexte d'activité, qui est lié au cycle de vie d'activité.

La documentation de ViewModel fait spécifiquement référence à ne pas utiliser le contexte d'activité, mais le contexte d'application s'il est correct.

5
Bamerza