当我必须使用 Hilt 作为依赖注入时,我可以手动创建一个实例吗?

Can I create an instance manually when I have to use Hilt as dependency injection?

我在我的项目中使用 Hilt 作为依赖项注入。

ObjectModule模块提供了MediaRecorder的实例,所以我可以在SoundViewModelHandleMeter中使用它。

为了释放资源,我不得不将null分配给SoundViewModelfun 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
       ...
    }
}
  1. 您可以手动创建实例,也可以从依赖注入中获取实例。没有区别,因为两者都会 return 一个新实例。

  2. 不,当您执行 mRecorder = MediaRecorder() 时,依赖注入不会重新创建实例。您实际上丢失了对依赖注入创建的初始实例的引用,并获得了分配给 mRecorder.

    MediaRecorder() 的新实例