어플리케이션을 만들다보면 Activity -> Fragment -> Adapter -> Service 등 여러개의 Component가 만들어지게되고 그 Component간의 통신이 필요하게된다. Activity나 서비스간의 통신으로 Intent나 Receiver를 사용해 통신할 수 있으나, Activity <-> Fragment <-> Adapter <-> Service 간의 통신을 하려면 자기자신을 static으로 선언해 타 Component에서 쓸수있게 하거나 context를 공유해야 했다.

terminal (출처 : http://gun0912.tistory.com/4)

예를 들면 Activity와 Fragment간 통신을 할때

MainActivity.java


    public static MainActivity shareInstance;

    @Override
    void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        MainActivity.shareInstance = this;
    }

    public void updateLayout(){
        //update layout
    }

Activity의 updateLayout() 함수를 호출하려면

MainFragment.java


    void onButtonClick(){
        MainActivity.shareInstance.updateLayout();
    }

와 같이 MainActivity의 객체를 static으로 공유해서 썼다.

하지만 Activity나 Fragment Adapter가 많아지고 Service에서 요청도 처리해야할 경우 점점 복잡해지며 shareInstance를 신뢰할 수도 없다.

이러한 Component간의 통신문제를 간단하게 해결한 라이브러리가 EventBus이다.

구글에서 만든 Guava와 EventBus와 Square에서 만든 Otto가 있다.

Otto에서는 3가지 개념이 있는데

terminal

Pub/Sub 방식으로 Event를 지정해 publishing하면 subscribing하고있는 함수로 call을 해주는 방식이다.

위의 예제를 EventBus를 이용해 아래와 같이 만들 수 있다.

MainActivity.java


    @Override
    void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        Bus.getInstance.registger(this);
    }

    @Subscribe
    public void updateLayout(LayoutUpdateEvent event){
        //update layout
    }

Activity의 updateLayout() 함수를 호출하려면

MainFragment.java


    void onButtonClick(){
        Bus.getInstance().post(new LayoutUpdateEvent());
    }

이렇게 Event class를 통해 Subscriber를 찾아 call하는 방식으로 구현할 수 있다.

이렇게 구성을 하면, sucscribe하고 있는 여러개의 함수에 call할 수 있고, adapter activity fragment service간 자유롭게 통신이 가능해 더 간결한 코드를 짤 수 있을것이다.