Dagger2.1x의 샘플 가져오기

9975 단어 Dagger2AndroidDI

계기.

  • UI 테스트를 작성할 때 제품 코드를 변경하지 않고 step를 사용하여 테스트를 진행하고자 합니다.
  • Dagger로 개체를 주입함으로써 구현됩니다.
  • 가져와서 예쁘게 쓴 것 같아서 Dagger2의 샘플 코드 기술을 소개했다.(UI 테스트에서 Dagger를 가져오는 경우 다른 기사에 기고할 예정)
  • 컨디션

  • Android Studio3.0.1
  • dagger2
  • Java(Kotlin의 DI는 Dagger 외에 다른 고민이 있다)
  • 참고 자료

  • New Android Injector with Dagger 2 — part 1
  • 위와 다른 기사를 보면서 모바일 샘플 애플리케이션으로 기사를 다시 보면서 동향을 파악했다.모방은 동작을 이해하기 어렵다.캐릭터와 동작을 파악하는 데 시간이 오래 걸렸다.
  • 샘플 응용 프로그램

  • sample
  • 도입된 추진 방법


    몇 반이 필요해서 하나씩 해요.동작을 확인할 수 있는 최소한의 코드를 준비하세요.

    app/build.gradle에서 설정 기술하기

    dependencies {
        def daggerVersion = "2.14.1"
        compile "com.google.dagger:dagger-android:$daggerVersion"
        compile "com.google.dagger:dagger-android-support:$daggerVersion"
        annotationProcessor "com.google.dagger:dagger-android-processor:$daggerVersion"
        annotationProcessor "com.google.dagger:dagger-compiler:$daggerVersion"
    }
    
    dagger와 관련된 반을build로 만듭니다.gradle에 기술하다.공식적으로 Dagger-compuiler에 대한 설명이 없어요.
    이쪽도 필요해.

    맞춤형 Application 클래스 제작


    MainApplication.java
    public class MainApplication extends Application implements HasActivityInjector, HasFragmentInjector {
    
        @Inject
        DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
        @Inject
        DispatchingAndroidInjector<Fragment> dispatchingFragmentInjector;
    
    
        @Override
        public void onCreate() {
            super.onCreate();
            DaggerAppComponent.builder().application(this).build().inject(this);
        }
    
        @Override
        public DispatchingAndroidInjector<Activity> activityInjector() {
            return dispatchingActivityInjector;
        }
    
        @Override
        public DispatchingAndroidInjector<Fragment> fragmentInjector() {
            return dispatchingFragmentInjector;
        }
    }
    
    
    학급 창설 단계에서는 DaggerAppComponent를 참조할 수 없지만 나중에 해결될 것이기 때문에 계속 진행할 것입니다.
    (HasFragmentInjector는 이 샘플에서 Fragment를 사용하지 않았기 때문에 필요없을 것 같다.)

    AppComponent 기술


    AppComponent.java
    @Singleton
    @Component(modules = {
            AndroidInjectionModule.class,
            AppModule.class,
            ActivityBuilder.class})
    public interface AppComponent {
        @Component.Builder
        interface Builder {
            @BindsInstance
            Builder application(Application application);
    
            AppComponent build();
        }
    
        void inject(MainApplication application);
    }
    
    
    Dagger App Component의 초기 형태가 된 학급

    AppModule 기술


    AppModule.java
    @Module
    class AppModule {
    
        @Singleton
        @Provides
        Context provideContext(Application application) {
            return application.getApplicationContext();
        }
    }
    
    
    전체 응용 프로그램에서 사용할 객체를 제공합니다.
    이번에는 컨텍스트를 대상으로 API 고객의 리포지토리 등을 기술한다.

    ActivityBuilder 기술


    ActivityBuilder.java
    @Module
    public abstract class ActivityBuilder {
        @ContributesAndroidInjector(modules = MainActivityModule.class)
        abstract MainActivity bindmainActivity();
    }
    
    
    Inject 객체의 Activity에 대해 설명합니다.

    MainActivity Module 기술


    MainActivityModule.java
    @Module
    public class MainActivityModule {
    //    @Provides
    //    HogeRepository provideRepository(MainActivity mainActivity) {
    //        return new HogeRepository(mainActivity);
    //    }
    }
    
    이 샘플은 App Module에 기술된 Context만 사용하기 때문에 여기에 아무것도 쓰지 않았습니다.객체 Activity에서 Inject가 필요한 경우 주석 출력에 대한 설명을 참조하십시오.

    MainActivity의 기술


    MainActivity.java
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        Context context;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            AndroidInjection.inject(this);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toast.makeText(context, "message", Toast.LENGTH_LONG).show();
        }
    }
    
    는 Inject 객체의 클래스입니다.Context를 사용하여 Toast를 표시합니다.
    토스트가 나올까요?

    끝맺다


    나는 Dagger의 DI를 사용해 보았다.이전 Dagger에 비해 액티비티에 기재된 코드가 적어 매끄럽다.
    응용 디자인에서 DI를 사용하면 도면층 사이의 거리를 희소하게 할 수 있기 때문에 다음에 사용하고 싶습니다.

    좋은 웹페이지 즐겨찾기