안드로이드

예를들어보겠습니다.

 

3개의 Activity A,B,C가 있습니다.

이 3개의 화면은 모두 같은 데이터를 가지고 다른형태로 화면에 뿌려줍니다.

만약 데이터가 변경되는경우 3개의 Activity는 각각 화면을 갱신해주는 작업을 해줘야 합니다.

D라는 Activity(Fragment,Dialog 등)에서 데이터가 변경되는 작업이 발생할경우 A,B,C에게 변경되었다는것을 알리고 변경된 객체를 넘겨주어야 각 3개의 Activity가 변경작업을 수행할것입니다.

A,B,C에서 각각 static함수를 선언해두고 D에서는 이 3개의 static 함수를 호출하면서 해당 변경객체를 넘겨주는 형태로 구현을 합니다.

 

이런 코드의 단점은 static 함수안의 변수들은 모두 static으로 선언되어야하는데 Activity자신이나 Context를 사용하는경우 등과 같이 static으로 사용할수 없는 경우에 문제가 발생합니다.

또한 해당 이벤트를 받고자하는 Activity,Fragment등이 많아질경우 소스코드는 점점 복잡해지고 이해하기 어려워 집니다.

 

 

이러한 경우 EventBus Otto를 사용하면 좋습니다.

Otto의 사용방법은 아래와 같습니다.

 

 

(Gradle추가)

compile 'com.squareup:otto:1.3.7'

 

 

1. Otto를 관리해주는 Singleton개념의 BusProvider 클래스를 생성해줍니다

 

public final class BusProvider {
   private static final Bus BUS = new Bus();

   public static Bus getInstance() {
      return BUS;
   }

   private BusProvider() {
      // No instances.
   }
}

 

 

 

 

 

 

 

2. 이벤트를 감지하고자하는 Activity 혹은 Fragment에서 register를 수행합니다

 

@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    // Register ourselves so that we can provide the initial value.
    BusProvider.getInstance().register(this);
}


@Override
protected void onDestroy() {
    // Always unregister when an object no longer should be on the bus.
    BusProvider.getInstance().unregister(this);
    super.onDestroy();

}

 

unregister의 시점은 상황에따라서 활용하기 나름입니다.

특정 이벤트를 받고나서 바로 unregister해주어도 상관없고 Activity나 Fragment가 Destroy되는 시점에 unregister해주어도 됩니다.

 

 

 

3. 이벤트가 발생했을때 수행할 함수를 만들어 줍니다


 


@Subscribe
public void FinishLoad(PushEvent mPushEvent) {

// 이벤트가 발생한뒤 수행할 작업

}

 

 

PushEvent라는 이벤트가 발생하는 경우 위 함수는 실행될 것입니다.

 

 

 

 

4. 이벤트를 날려주는 부분에서 이벤트를 생성해줍니다

 


BusProvider.getInstance().post(new PushEvent(results));

PushEvent라는 객체를 새로 생성하고 해당 이벤트를 post해줍니다.

 

 

참고.

여기서 사용된 PushEvent클래스는 아래와 같습니다.

Event클래스는 어떻게 구현해도 좋습니다.

 

 



public class PushEvent
{
// the pushlist object being sent using the bus
private List pushlist;

public PushEvent(List pushlist)
{
this.pushlist = pushlist;
}

/**
* @return the pushlist
*/
public List getList()
{
return pushlist;
}
}

 

최종 Event Bus를 사용하는 그림은 아래와 같은 방식이 될것입니다.

 

 

 

정리해보자면 동작방식은 아래와 같습니다

1. 이벤트 리스너를 등록해준다(Subscriber)

2. 이벤트가 발생했을때 수행할 작업을 만들어 둔다(Subscriber)

3. 이벤트가 발생하는 위치에서 이벤트가 발생했다고 알린다(Publisher)

4. 해당 이벤트에서 원하는 변수,리스트 등을 받아서 작업을 처리한다(Subscriber)

5. 이벤트 리스너를 등록해제해준다(Subscriber)

 

 

 

 

 

 

 

Event Bus개념과 관련된 참고할만한 자료들 링크 소개해드립니다.

http://www.slideshare.net/greenrobot/eventbus-for-android-15314813

 

http://www.vogella.com/tutorials/JavaLibrary-EventBusOtto/article.html

 

http://aroundck.tistory.com/2068



출처: http://gun0912.tistory.com/4 [박상권의 삽질블로그]

 

about author

PHRASE

Level 60  머나먼나라

반딧불로 별을 대적하랴 , 하찮은 것이 아무리 억척을 부려도 되지 않을 일을 함을 이르는 말.

댓글 ( 0)

댓글 남기기

작성