Android MVC:向控制器发送消息
如本博客所示,作者建议控制器通过如下处理程序从视图中获取其消息:Android MVC:向控制器发送消息,android,model-view-controller,controller,handler,Android,Model View Controller,Controller,Handler,如本博客所示,作者建议控制器通过如下处理程序从视图中获取其消息: inboxHandlerThread = new HandlerThread("Controller Inbox"); // note you can also set a priority here inboxHandlerThread.start(); // ... some code omitted ... inboxHandler = new Handler(inboxHandlerThread.getLoop
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中存在问题。如果我要制作一个真正的控制器,我需要委托给活动中的控制器方法,比如boolean dispatchKeyEvent(KeyEvent事件)。然而,由于处理程序是异步的,我不知道KeyEvent是否实际被处理过,并且不能返回适当的值
相反,我选择从视图传递事件,只需在控制器上调用一个方法,如
boolean sendMessage(int what);
boolean sendMessage(int what, Object data);
通过这种方式,我可以立即从我的控制器获得一个适当的返回值,如果控制器需要异步处理这些值,它可以透明地执行,并且我仍然可以得到一个响应,即消息将在现在或将来处理
我的问题:
MindTheRobot使用的方法到底有什么优势
controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE);
有点像
controller.sendMessage(Controller.HANDLE_UPDATE);
?
我看不出有什么好处,在我看来,他似乎正在打破封装,不必要地暴露这个类的内部
编辑:
好的,简单一点。你们采取什么方法将消息从视图发送到控制器?MVC体系结构中的视图和模型都应该作为独立的组件编写。另一方面,控制器可能(实际上通常是)暴露于视图和模型的实现细节中 这意味着,如果您在MVC视图中获得了对MVC控制器的引用(我知道您是这样做的),那么您的MVC有点“坏了”。MVC视图应该不知道将绑定到它的控制器 实现这一点的一种方法是使用-使您的控制器实现预定义的界面,而视图允许观察者注册通知 然而,我认为这种方法有点麻烦,因此我寻找了一种替代方法。在这种情况下,GreenRobot只是一个宝藏——易于使用、快速、轻便。试试看
我还创建了MVP教程/模板应用程序,演示了您可以使用的方法之一。它使用前面提到的EventBus在组件之间进行通信。源代码如下:MVC体系结构中的视图和模型都应作为独立、独立的组件编写。另一方面,控制器可能(实际上通常是)暴露于视图和模型的实现细节中 这意味着,如果您在MVC视图中获得了对MVC控制器的引用(我知道您是这样做的),那么您的MVC有点“坏了”。MVC视图应该不知道将绑定到它的控制器 实现这一点的一种方法是使用-使您的控制器实现预定义的界面,而视图允许观察者注册通知 然而,我认为这种方法有点麻烦,因此我寻找了一种替代方法。在这种情况下,GreenRobot只是一个宝藏——易于使用、快速、轻便。试试看
我还创建了MVP教程/模板应用程序,演示了您可以使用的方法之一。它使用前面提到的EventBus在组件之间进行通信。源代码如下:对我来说,这个问题很有趣,我写了一个博客系列来回答这些类型的问题:对我来说,这个问题很有趣,我写了一个博客系列来回答这些类型的问题: