티스토리 뷰

https://github.com/googlesamples/android-architecture


위의 아키텍처 중에 mvp-dagger2를 적용하다가,


내가 알던 dagger2와 다르게 사용을 해서 이게 뭔가 찾아봤다.


가장 다른 점은 크게 두개다.


1. @Binds 얘는 무엇인가?


2. @ContributesAndroidInjector 얘는 뭐니?


그래 찾아보니, 내가 모르는 게 당연 예전에 썻던 dagger2의 적용에 대한 글에서 하는거 처럼 안했으니까 그럼 뭔가?


https://proandroiddev.com/dagger-2-android-modules-e168821cfc57


요 링크를 참고하자.


요약하자면,


기존의 dagger2의 방법대로 (제이크 왈튼 옹의 강의) 사용하면, activity를 만들 때마다 build() 하고 inject() 해주는 보기 안 좋은 


boilerplate들이 많아져서 Gregory Kick이란 분께서 Dagger2의 새로운 사용방법을 제시했단다요.



바로 이것이래용



그래서 짧게 나는 요약한 것만 가져와서 말할꺼임.


TODO 앱에서는 이렇게 씀.



1. ActivityBindingModule

@Module
public abstract class ActivityBindingModule {
@ActivityScoped
@ContributesAndroidInjector(modules = TasksModule.class)
abstract TasksActivity tasksActivity();

@ActivityScoped
@ContributesAndroidInjector(modules = AddEditTaskModule.class)
abstract AddEditTaskActivity addEditTaskActivity();

@ActivityScoped
@ContributesAndroidInjector(modules = StatisticsModule.class)
abstract StatisticsActivity statisticsActivity();

@ActivityScoped
@ContributesAndroidInjector(modules = TaskDetailPresenterModule.class)
abstract TaskDetailActivity taskDetailActivity();
}

- 일단은 우리가 공급을 해줘야 된다. 이때 layer를 하나 더 둔다고 생각하면 된다. 각각의 Acitivity에 대하여 전부 모듈을 만들어서 하나하나씩 Component에서 선언해주면 지저분해지니까, Activity와 Activity 모듈을 각각 만들고 이를 합쳐주는 module을 하나 또 만든다잉.



2. AppComponent

@Singleton
@Component(modules = {TasksRepositoryModule.class,
ApplicationModule.class,
ActivityBindingModule.class,
AndroidSupportInjectionModule.class})
public interface AppComponent extends AndroidInjector<ToDoApplication> {

@Component.Builder
interface Builder {

@BindsInstance
AppComponent.Builder application(Application application);

AppComponent build();
}
}

- 그래서 AppComponent 딴에서 공급자를 Builder 해줌. 그럼 Application에서 전역적으로 가져다 쓸 수 있당.



3. Application

public class ToDoApplication extends DaggerApplication {

@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().application(this).build();
}
}

- Application에서 이런식으로 build. extends DaggerApplication!



4. ActivityModule

@Module
public abstract class StatisticsModule {

@FragmentScoped
@ContributesAndroidInjector
abstract StatisticsFragment statisticsFragment();

@ActivityScoped
@Binds
abstract StatisticsContract.Presenter statisticsPresenter(StatisticsPresenter presenter);
}

- Activity 모듈에는 필요한 애들을 선언해주셈. 여기서 참고로 @Binds는 @Provides에서 parameter를 그대로 return하는 과정을 줄여준다.



5. Activity

public class StatisticsActivity extends DaggerAppCompatActivity {

@Inject
StatisticsPresenter mStatiticsPresenter;
@Inject
StatisticsFragment fragment;

- DaggerAcitivty를 상속받아서 Activity를 생성하면 된당. 이상 전달 끝



요약하자면,


1. DaggerApplication을 상속한다. 얘가 필수적인 dispatcher들을 주입한단다. dispatcher가 뭔지 몰라서 찾아봄.

dispatcher : 먼저 수행되야 할 작업을 선택해서 공급해주는 놈이라고 한단다. (운영체제 딴에서)

그니까 여기서는 뭐 솔직히 잘 모르겠다.


2. AndroidSupportInjectionModule.class를 AppComponent에 선언해주어야 됨.


3. @ContributesAndroidInjector 얘로 bind를 해줄꺼임.



잘들 해보셈 어렵소

'개발 > 안드로이드' 카테고리의 다른 글

Android Context!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  (0) 2017.11.16
Android Different Languages 적용기  (1) 2017.11.15
Android Custom Content Provider  (0) 2017.11.01
Android SQLite Database  (3) 2017.10.27
Android Content Provider  (0) 2017.10.26
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31