본문으로 바로가기

키오스크에는 시동어를 감시하는 Main Recognizer 와 

시동어 이후 문장을 감시하는 Sub Recognizer 두가지가 필요했기때문에

같은 SpeechRecognizer 의 두가지 변수가 필요했다.

 

그렇기 때문에 다음과 같이 모듈에서 생성자를 주입해 사용하고 있었는데,

@InstallIn(SingletonComponent::class)
@Module
class AppModule {
	
    @Singleton
    @Provides
    fun provideRecognizer(@ApplicationContext context: Context): SpeechRecognizer {
        return Speech.createRecognizer(context)
    }
}

어째선지 viewModel 에서 주입받아 사용한 두 SpeechRecognizer가 동일한 변수로서 취급이 되는 것이 아닌가? 

 

내가 겪은 문제는 여기(스택오버플로우) 서 겪은 문제와 동일했다.

 

요점은 다음과 같이 힐트모듈을 사용할 수 있느냐다.

@Module
@InstallIn(ActivityComponent::class)
class AdapterModule {
    
    @Provides
    @ActivityScoped
    fun provideAdapterAInstace(): AdapterA {
        return AdapterA()
    }
}

// Usage
class ActivityA extends AppCompatActivity {
    
    @Inject
    lateinit var instanceOne: AdapterA
    
    @Inject
    lateinit var instanceTwo: AdapterA

    ...
}

 

결론적으로 가능하다.

허나 위의 경우에는, @ActivityScoped 어노테이션이 문제가 되어 위처럼 여러 변수를 주입할 수 없었던 것이다.

 @ActivityScoped 는 하나의 액티비티당 한번만 변수를 주입하기 때문이다.

 

나의 경우에도 마찬가지로 @Singleton 이 문제가 되어 변수를 여러번 주입받을 수 없었다.

 

@Singleton 어노테이션을 제거 후 정상적으로 SpeechRecognizer 를 두번 주입 받을 수 있었다.