2011-11-14 3 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에서 문제가 발생했습니다. 실제 컨트롤러를 만들려면 boolean dispatchKeyEvent (KeyEvent 이벤트)와 같은 Activity의 컨트롤러 메서드에 위임해야합니다. 그러나 Handler가 비동기 적이기 때문에 KeyEvent가 실제로 처리되었고 적절한 값을 반환 할 수 있는지 여부는 알 수 없습니다.

대신보기에서 내 이벤트를 전달하기 위해

과 같은 컨트롤러에서 메서드를 호출하기로했습니다.이 방법을 사용하면 컨트롤러에서 즉시 적절한 반환 값을 얻을 수 있습니다. 비동기 적으로 이러한 메시지를 처리 ​​할 수 ​​있습니다. 투명하게 처리 할 수 ​​있으며 메시지가 현재 또는 미래에 처리 될 것이라는 응답을받을 수 있습니다.

내 질문 :

controller.getHandler.sendEmptyMessage(Controller.HANDLE_UPDATE); 

를 사용하는 MindTheRobot의 접근 방식은

controller.sendMessage(Controller.HANDLE_UPDATE); 

과 비슷한 것을 가지고 있습니다.

어떤 장점도 보이지 않으며 캡슐화를 깨고이 클래스의 내부를 불필요하게 노출하는 것처럼 보입니다.

편집 : 좋아, 뭔가 쉽게. 뷰에서 컨트롤러로 메시지를 전송하기 위해 어떤 접근 방식을 취하고 있습니까?

+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

관련 문제