当我必须使用 Hilt 作为依赖注入时,我可以手动创建一个实例吗?
Can I create an instance manually when I have to use Hilt as dependency injection?
我在我的项目中使用 Hilt 作为依赖项注入。
ObjectModule
模块提供了MediaRecorder
的实例,所以我可以在SoundViewModel
和HandleMeter
中使用它。
为了释放资源,我不得不将null
分配给SoundViewModel
的fun stop()
中的mRecorder
,所以我需要创建一个[=12的实例=] 在 fun play()
中根据需要。
1:需要自己用mRecorder = MediaRecorder()
创建实例吗?我可以从依赖注入中获取它吗?
2: 当我使用 fun play()
中的 mRecorder = MediaRecorder()
创建 class HandleMeter @Inject constructor(val mRecorderFromDI: MediaRecorder)
中的 MediaRecorder
实例时,是否会再次通过依赖注入重新创建它?
@HiltViewModel
class SoundViewModel @Inject constructor(
private val aHandleMeter: HandleMeter,
private var mRecorder: MediaRecorder?
): ViewModel() {
fun play() {
//In order to handel re-play, so I write the following code.
if (mRecorder==null) {
mRecorder = MediaRecorder() //Do I need create by myself? Can I get it from dependency injection ?
}
mRecorder?.let {
with(it) {
setAudioSource(MediaRecorder.AudioSource.MIC);
...
prepare()
start()
}
}
val my= aHandleMeter.getMSoundDensity()
...
}
fun stop() {
try {
mRecorder?.stop()
mRecorder?.release()
mRecorder = null
} catch (e: Exception) {
}
}
}
@InstallIn(SingletonComponent::class)
@Module
object ObjectModule {
@Provides
@Singleton
fun provideMediaRecorder(): MediaRecorder {
return MediaRecorder()
}
}
class HandleMeter @Inject constructor(val mRecorderFromDI: MediaRecorder): IHandleMeter {
override fun getMSoundDensity(): Flow<MSoundDensity> {
val temp = mRecorderFromDI.maxAmplitude
...
}
}
您可以手动创建实例,也可以从依赖注入中获取实例。没有区别,因为两者都会 return 一个新实例。
不,当您执行 mRecorder = MediaRecorder()
时,依赖注入不会重新创建实例。您实际上丢失了对依赖注入创建的初始实例的引用,并获得了分配给 mRecorder
.
的 MediaRecorder()
的新实例
我在我的项目中使用 Hilt 作为依赖项注入。
ObjectModule
模块提供了MediaRecorder
的实例,所以我可以在SoundViewModel
和HandleMeter
中使用它。
为了释放资源,我不得不将null
分配给SoundViewModel
的fun stop()
中的mRecorder
,所以我需要创建一个[=12的实例=] 在 fun play()
中根据需要。
1:需要自己用mRecorder = MediaRecorder()
创建实例吗?我可以从依赖注入中获取它吗?
2: 当我使用 fun play()
中的 mRecorder = MediaRecorder()
创建 class HandleMeter @Inject constructor(val mRecorderFromDI: MediaRecorder)
中的 MediaRecorder
实例时,是否会再次通过依赖注入重新创建它?
@HiltViewModel
class SoundViewModel @Inject constructor(
private val aHandleMeter: HandleMeter,
private var mRecorder: MediaRecorder?
): ViewModel() {
fun play() {
//In order to handel re-play, so I write the following code.
if (mRecorder==null) {
mRecorder = MediaRecorder() //Do I need create by myself? Can I get it from dependency injection ?
}
mRecorder?.let {
with(it) {
setAudioSource(MediaRecorder.AudioSource.MIC);
...
prepare()
start()
}
}
val my= aHandleMeter.getMSoundDensity()
...
}
fun stop() {
try {
mRecorder?.stop()
mRecorder?.release()
mRecorder = null
} catch (e: Exception) {
}
}
}
@InstallIn(SingletonComponent::class)
@Module
object ObjectModule {
@Provides
@Singleton
fun provideMediaRecorder(): MediaRecorder {
return MediaRecorder()
}
}
class HandleMeter @Inject constructor(val mRecorderFromDI: MediaRecorder): IHandleMeter {
override fun getMSoundDensity(): Flow<MSoundDensity> {
val temp = mRecorderFromDI.maxAmplitude
...
}
}
您可以手动创建实例,也可以从依赖注入中获取实例。没有区别,因为两者都会 return 一个新实例。
不,当您执行
的mRecorder = MediaRecorder()
时,依赖注入不会重新创建实例。您实际上丢失了对依赖注入创建的初始实例的引用,并获得了分配给mRecorder
.MediaRecorder()
的新实例