[英]Can I create an instance manually when I have to use Hilt as dependency injection?
I use Hilt as dependency injection in my project.我在我的项目中使用 Hilt 作为依赖项注入。
The ObjectModule
module provides the instance of MediaRecorder
, so I can use it in both SoundViewModel
and HandleMeter
. ObjectModule
模块提供了MediaRecorder
的实例,所以我可以在SoundViewModel
和HandleMeter
中使用它。
In order to release resources, I have to assign null
to mRecorder
in fun stop()
of SoundViewModel
, so I need to create an instance of MediaRecorder
in fun play()
as needed.为了释放资源,我必须在
null
的fun stop()
中将mRecorder
分配给SoundViewModel
,因此我需要根据需要在fun play()
中创建一个MediaRecorder
实例。
1: Do I need create the instance using mRecorder = MediaRecorder()
by myself? 1:需要自己用
mRecorder = MediaRecorder()
创建实例吗? Can I get it from dependency injection?我可以从依赖注入中获取它吗?
2: Will the instance of MediaRecorder
in class HandleMeter @Inject constructor(val mRecorderFromDI: MediaRecorder)
be recreated by dependency injection again when I have created it using mRecorder = MediaRecorder()
in fun play()
? 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
...
}
}
You can create the instance manually and you can also get that from your Dependency injection.您可以手动创建实例,也可以从依赖注入中获取实例。 There is no difference as both will return a new instance.
没有区别,因为两者都会返回一个新实例。
No, the instance is not recreated by Dependency injection when you do mRecorder = MediaRecorder()
.不,当您执行
mRecorder = MediaRecorder()
时,依赖注入不会重新创建实例。 You actually lose reference to initial instance created by dependency injection and get a new instance of MediaRecorder()
assigned to mRecorder
.您实际上失去了对依赖注入创建的初始实例的引用,并获得了分配给
mRecorder
的MediaRecorder()
的新实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.