키오스크에는 시동어를 감시하는 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 를 두번 주입 받을 수 있었다.