AndroidAnnotations는 어떤 객체에 대한 주입(injection)이 완료된 이후에 코드를 실행할 수 있는 @AfterInject 어노테이션을 제공합니다.
그리고 GuiceyFruit나 MycilaGuice 같은 라이브러리도 인젝션에 대한 콜백을 받을 수 있는 JSR250의 @PreDestroy, @PostConstruct 어노테이션을 구현하여 제공합니다.
그러나 대표적인 안드로이드용 Injection 프레임워크인 RoboGuice는 객체가 생성되고 필드에 대한 주입이 모두 끝난 이후 지정된 메소드(ex. 초기화 메소드)를 실행하는 깔끔한 방법을 제공하지 않습니다.
다행히 방법이 전혀 없는 것은 아닙니다. 2가지 방법이 존재합니다.
1. InjectionListener를 이용
유연한 방법은 아니지만 Guice의 InjectionListener를 구현하여 주입이후에 지정된 메소드를 실행하게 할 수 있습니다.
(아래 코드에서는 MyInitClass 객체에 대한 모든 주입이 끝나고 나서 init 메소드를 실행합니다)
bindListener(Matchers.subclassesOf(MyInitClass.class), new TypeListener() {
@Override
public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) {
typeEncounter.register(new InjectionListener<I>() {
@Override
public void afterInjection(Object i) {
MyInitClass m = (MyInitClass) i;
m.init();
}
});
}
});
2. @Inject를 이용
Guice는 필드에 대한 모든 주입을 끝내고 나면 @Inject가 붙은 메소드를 실행한다고 합니다.
@Inject
protected void init() {
... ...
}
이 방법은 약간의 트릭에 해당하지만 매우 간단하기 때문에 저는 이 방법을 사용합니다. 자세한 내용은 다음 링크를 참고하세요.
http://stackoverflow.com/questions/2093344/guice-call-init-method-after-instantinating-an-object
'Android' 카테고리의 다른 글
AndroidAnnotations의 @Background, @UiThread 어노테이션 흉내내기 (0) | 2012.11.07 |
---|---|
AndroidAnnotations의 @Click 어노테이션 흉내내기 (1) | 2012.04.29 |
[RoboGuice] 어노테이션 활용 (0) | 2012.04.29 |
RoboGuice에서 Aspect에 injection하는 방법 (0) | 2012.04.29 |
[안드로이드] RoboGuice 단점 보완 방안 (0) | 2012.04.19 |