【发布时间】:2011-12-29 01:46:10
【问题描述】:
如本博客Mind The Robot 所示,作者建议控制器通过如下处理程序从视图获取消息:
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 event)。但是,由于处理程序是异步的,我不知道 KeyEvent 是否已实际处理并且无法返回适当的值。
相反,我选择从视图中传递我的事件,只需调用控制器上的方法,如
boolean sendMessage(int what);
boolean sendMessage(int what, Object data);
这样我可以立即从我的控制器获得一个适当的返回值,如果控制器需要异步处理这些,它可以透明地获得,我仍然可以得到一个响应,即现在或将来会处理该消息。
我的问题: MindTheRobot 使用的方法有什么优势
controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE);
有过类似的事情
controller.sendMessage(Controller.HANDLE_UPDATE);
?
我没有看到任何优势,在我看来,他甚至似乎在破坏封装并不必要地暴露这个类的内部。
编辑: 好吧,更简单的事情。你们采用什么方法将消息从视图发送到控制器?
【问题讨论】:
-
对我来说这个问题也很有趣
-
我写了一个博客系列来回答这些类型的问题:therealjoshua.com/blog
标签: android model-view-controller controller handler