Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MVC:向控制器发送消息_Android_Model View Controller_Controller_Handler - Fatal编程技术网

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在组件之间进行通信。源代码如下:

对我来说,这个问题很有趣,我写了一个博客系列来回答这些类型的问题:对我来说,这个问题很有趣,我写了一个博客系列来回答这些类型的问题: