如本博客Mind The Robot所示,作者建议控制器通过处理程序从View中获取消息,如下所示:
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);
由于sendMessage方法和处理程序的异步,我发现这种方法在Android中存在问题。如果我要创建一个真正的控制器,我需要委托Activity中的控制器方法,如boolean dispatchKeyEvent(KeyEvent事件)。但是,因为处理程序是异步的,所以我不知道KeyEvent是否实际处理过,并且无法返回适当的值。
相反,我选择从View中传递我的事件,只需在控制器上调用一个方法,如
boolean sendMessage(int what);
boolean sendMessage(int what, Object data);
这样我可以立即从我的控制器获得一个适当的返回值,如果控制器需要异步处理它们,它可以透明地进行,我仍然可以得到一个回复,即现在或将来都会处理该消息。
我的问题: MindTheRobot使用
的方法有什么优势controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE);
有类似
之类的东西controller.sendMessage(Controller.HANDLE_UPDATE);
我没有看到任何优点,对我来说,甚至看起来他正在破坏封装并不必要地暴露这个类的内部。
修改 好的,更轻松的事情。你们采用什么方法将视图中的消息发送给控制器?
答案 0 :(得分:0)
MVC架构中的视图和模型都应该作为独立的独立组件编写。另一方面,控制器可能(并且实际上通常是)暴露于视图和模型的实现细节。
这意味着如果你在MVC视图中获得了对MVC控制器的引用(我明白你这样做了) - 你的MVC有些“破坏了”#34; MVC视图应该对控制器一无所知。
解决此问题的一种方法是使用Observer Design Pattern - 让控制器实现预定义的接口,而视图允许观察者注册通知。
但是,我认为这种方法有点麻烦,因此我寻找替代方案。 GreenRobot的EventBus在这方面只是一个宝藏 - 易于使用,快速和轻便。试一试。
我还创建了MVP教程/模板应用程序,演示了您可以使用的方法之一。它使用上述EventBus进行组件之间的通信。源代码位于:https://github.com/techyourchance/android_mvc_template