2011-11-14 31 views
2

在本博客Mind The Robot所示,筆者建議控制器得到它通過像這樣的處理程序是從查看消息:Android的MVC:將消息發送到控制器

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中的控制器方法,如布爾dispatchKeyEvent(KeyEvent事件)。但是,因爲處理程序是異步的,我不知道KeyEvent是否實際處理過,並且不能返回適當的值。

相反,我選擇了從視圖通過我的事件只調用一個方法在控制器上像

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

這樣我可以從我的控制器立即得到相應的回報值,如果控制器需要處理這些異步它可以透明,我仍然可以得到一個迴應,消息將被處理現在或將來。

我的問題: 有過類似

controller.sendMessage(Controller.HANDLE_UPDATE); 

什麼優勢可言並使用

controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE); 

從MindTheRobot的辦法?

我沒有看到任何優勢,對我來說甚至好像他正在破解封裝,並且暴露了這個類的內部不必要的東西。

編輯: 好吧,更容易。你們用什麼方法將信息從視圖發送到控制器?

+0

對我來說這個問題也很有趣 – drifter

+0

我寫了一個博客系列回答這些類型的問題:http://www.therealjoshua.com/blog/ – user123321

回答

0

MVC體系結構中的視圖和模型都應該作爲獨立的獨立組件編寫。另一方面,控制器可能(並且實際上通常)暴露於視圖和模型的實現細節。

這意味着如果你在MVC視圖中獲得了對MVC控制器的引用(並且我理解你這麼做) - 那麼你的MVC有點「破碎」了。 MVC視圖應該對與之綁定的控制器一無所知。

解決此問題的一種方法是使用Observer Design Pattern - 使控制器實現預定義的界面,同時視圖允許觀察員註冊通知。

但是,我認爲這種方法有點麻煩,所以我搜索了一個替代方案。 GreenRobot的EventBus只是這方面的寶藏 - 易於使用,快速和輕便。試一試。

我還創建了MVP教程/模板應用程序,它演示了您可以使用的一種方法。它使用前面提到的EventBus來進行組件之間的通信。源代碼在這裏:https://github.com/techyourchance/android_mvc_template

相關問題