2011-11-14 4 views
2

Comme le montre ce blog Mind The Robot, l'auteur suggère que le contrôleur obtient est des messages de la vue par un gestionnaire comme ceci:Android MVC: Envoi de messages au contrôleur

inboxHandlerThread = new HandlerThread("Controller Inbox"); // note you can also set a priority here 
inboxHandlerThread.start(); 

    // ... some code omitted ... 

inboxHandler = new Handler(inboxHandlerThread.getLooper()) { 
    @Override 
    public void handleMessage(Message msg) { 
    Controller.this.handleMessage(msg); 
    } 
}; 

// from the View 
controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE); 

En raison de la asynchrone de la méthode sendMessage et gestionnaire, je trouve cette approche problématique dans Android. Si je dois faire un vrai contrôleur, j'ai besoin de déléguer aux méthodes de contrôleur dans l'activité comme boolean dispatchKeyEvent (événement KeyEvent). Cependant, étant donné que le gestionnaire est asynchrone, je ne sais pas si KeyEvent a été traité et ne peut pas renvoyer une valeur appropriée.

J'ai plutôt choisi de passer mes événements de la vue avec juste appeler une méthode sur le contrôleur comme

boolean sendMessage(int what); 
boolean sendMessage(int what, Object data); 

De cette façon, je peux obtenir une bonne valeur de retour immédiatement de mon contrôleur et si le contrôleur doit gérer ces choses de manière asynchrone, cela peut être transparent et je peux toujours obtenir une réponse en retour que le message sera traité soit maintenant ou dans le futur.

Ma question: Quel est l'avantage du tout l'approche de l'aide MindTheRobot

controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE); 

ont sur quelque chose comme

controller.sendMessage(Controller.HANDLE_UPDATE); 

?

Je ne vois aucun avantage et pour moi il semble même qu'il brise l'encapsulation et expose inutilement les internes de cette classe.

EDIT: OK, quelque chose de plus facile. Quelle approche adoptez-vous pour envoyer des messages de vos vues à vos contrôleurs?

+0

Pour moi cette question est aussi intéressante – drifter

+0

J'ai écrit une série de blogs répondant à ces types de questions: http://www.therealjoshua.com/blog/ – user123321

Répondre

0

Les vues et les modèles dans l'architecture MVC doivent être écrits en tant que composants autonomes indépendants. D'un autre côté, le contrôleur peut être (et, en pratique, il est généralement) exposé aux détails de mise en œuvre de la vue et du modèle. Cela signifie que si vous avez une référence au contrôleur MVC dans votre vue MVC (et je comprends que vous le faites), votre MVC est quelque peu "cassé". La vue MVC ne devrait rien savoir sur le contrôleur qui sera lié à celui-ci.

Une façon de procéder est d'utiliser Observer Design Pattern - de faire en sorte que vos contrôleurs implémentent une interface prédéfinie, tandis que les vues permettent aux observateurs de s'enregistrer pour les notifications.

Cependant, je pense que cette méthode est un peu lourde, donc j'ai cherché une alternative. Le EventBus de GreenRobot est simplement un trésor dans ce contexte - facile à utiliser, rapide et léger. Essaie. J'ai également créé un tutoriel MVP/application de modèle qui montre l'une des approches que vous pouvez utiliser. Il utilise le EventBus mentionné ci-dessus pour la communication entre les composants. Le code source est ici:

Questions connexes