박상권의 삽질블로그

[안드로이드/Android]유용한 라이브러리 - Otto(Event Bus) 본문

IT/Android-TIP (한글)

[안드로이드/Android]유용한 라이브러리 - Otto(Event Bus)

박상권 2015. 6. 30. 09:12

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여


블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기


이번에 '클린 아키텍처'를 주제로 온라인 강의를 개설하게 되었습니다 🎉
평소 오픈채팅방이나 여러 커뮤니티에서 '클린 아키텍처'와 관련된 질문들이 많았는데요. 이를 해결해줄 수 있는 마땅한 강의가 없었던것 같습니다.
평소 '클린 아키텍처' 에 대한 궁금증이나 관심이 있으셨던 분들이 수강해보시면 도움이 될것 같아요
강의 살펴보기




Otto라이브러리는 Square에서 만든 event bus형태의 라이브러리 입니다.


홈페이지   GitHub







예를들어보겠습니다.


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<Push> pushlist;

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

/**
* @return the pushlist
*/
public List<Push> 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

Comments