Récemment, j'ai décidé de regarder de plus près à la nouvelle Android des Composants de l'Architecture que Google a publié, en particulier à l'aide de leur ViewModel du cycle de vie-conscience de classe à une architecture MVVM, et LiveData.
Aussi longtemps que je m'occupe d'une Activité, ou un Fragment unique, tout va bien.
Cependant, je ne peux pas trouver une solution sympa pour gérer l'Activité de commutation. Dire, pour l'amour d'un court exemple, que l'Activité a un bouton pour lancer l'Activité B.
Où serait le startActivity() seront-ils traités?
Suivant le modèle MVVM, la logique de la clickListener devrait être dans le ViewModel. Cependant, nous voulons éviter d'avoir les références à l'Activité là-bas. Donc en passant le contexte de ce Dernier n'est pas une option.
J'ai rétréci vers le bas d'un couple d'options qui semblent "OK", mais n'a pas été en mesure de trouver la bonne réponse", voici comment le faire.".
Option 1 : vous Avez un enum dans le ViewModel avec les valeurs de la cartographie de routage possibles (ACTIVITY_B, ACTIVITY_C). Couplez cela avec une LiveData. L'activité serait d'observer ce LiveData, et lorsque ce Dernier décide que ACTIVITY_C devrait être lancé, il venait de postValue(ACTIVITY_C). L'activité peut alors appeler startActivity() normalement.
Option 2 : L'ordinaire de l'interface de modèle. Même principe que pour l'option 1, mais l'Activité devrait mettre en œuvre l'interface. Je me sens un peu plus le couplage avec cette même si.
Option 3 : option de Messagerie, tels que Otto ou similaire. ViewModel envoie une Diffusion, l'Activité reprend et lance ce qu'il a à la. Seul problème avec cette solution est que, par défaut, vous devez mettre le s'inscrire/se désinscrire de la Diffusion à l'intérieur du ViewModel. Si cela n'aide pas.
Option 4 : Avoir un gros Routage classe, quelque part, en tant que singleton ou similaires, qui pourraient être appelés à l'expédition pertinentes de routage à toute activité. Finalement via l'interface? Ainsi, chaque activité (ou un BaseActivity) serait de mettre en œuvre
IRouting { void requestLaunchActivity(ACTIVITY_B); }
Cette méthode m'inquiète un peu quand votre application commence à avoir un grand nombre de fragments/activités (parce que le Routage de la classe qui allait devenir gigantesque)
Donc, c'est ça. C'est ma question. Comment faites-vous pour gérer cela? Ne vous y allez avec une option que je n'ai pas pensé? Quelle option avez-vous jugent les plus pertinentes et pourquoi? Qu'est-ce que le recommandé Google?
PS : les Liens qui ne m'obtenez pas n'importe où 1 - Android ViewModel Activité des appels de méthodes 2 - Comment faire pour démarrer une activité à partir d'une plaine de non-activité de la classe java?