我有ExoPlayerWrapper
类,它是ExoPlayer
的包装器,由Dagger单例注入(inject)。 ExoPlayerWrapper
类中的Init块的外观如下:
@Singleton
class ExoPlayerWrapper @Inject constructor(
context: Context,
userAgentInfo: UserAgentInfo
) {
private val exoPlayer: ExoPlayer
private val httpDataSource: HttpDataSource
private val mediaSourceFactory: ExtractorMediaSource.Factory
override val exoPlayerInstance: ExoPlayer
get() = exoPlayer
init {
...
exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector)
httpDataSource = CustomHttpDataSource(userAgentInfo.userAgent, null)
mediaSourceFactory = ExtractorMediaSource.Factory { httpDataSource }
state = Player.STATE_IDLE
}
override fun playFromUrl(uri: Uri, headers: Map<String, String>) {
reset()
...
val mediaSource = mediaSourceFactory.createMediaSource(uri)
exoPlayer.prepare(mediaSource)
exoPlayer.playWhenReady = true
}
override fun pause() {
exoPlayer.playWhenReady = false
}
override fun reset() {
stop()
state = Player.STATE_IDLE
}
override fun stop() {
exoPlayer.stop()
exoPlayer.seekTo(0)
}
override fun seekTo(position: Long) {
exoPlayer.seekTo(position)
}
...
override fun release() {
exoPlayer.release()
state = Player.STATE_RELEASED
}
在
onCreate()
的Activity
方法中,我有以下代码:public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_player)
...
if (savedInstanceState != null) {
initialized = savedInstanceState.getBoolean(INITIALIZED)
}
if (!initialized) {
val uri = Uri.parse(attachedVideo?.uri)
player.playFromUrl(uri, sessionStore.sessionHeaders)
videoView.requestFocus()
initialized = true
}
videoView.player = player.exoPlayerInstance
backBtn.setOnClickListener{ _ ->
player.release()
finish()
}
}
但是在这种情况下,单击
backBtn
按钮后我只能播放一个视频,此后其他视频将不播放,直到我关闭应用程序并再次重新打开应用程序。如果我以以下方式更改backBtn's OnClickListener
:backBtn.setOnClickListener{ _ ->
player.pause()
finish()
}
一切正常,点击
backBtn
按钮后播放其他视频。因此,在调用ExoPlayer
方法之后,重新初始化release()
似乎存在问题。以及释放后如何正确重新初始化ExoPlayer?UPD
在
release()
调用之后,并尝试再次打开视频后,我在Logcat中看到以下错误:最佳答案
该问题是由于尝试使用已释放资源的播放器而引起的。因为:
exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector)
在
ExoPlayerWrapper
初始化期间仅被调用一次。如果您的 Activity 没有重新开始,则ExoPlayerWrapper
实例将与释放的播放器一起存在。您可以在每次播放视频时创建一个新的
ExoPlayerWrapper
实例,或者在ExoPlayerWrapper
中创建一个播放器初始化方法,可以在播放视频之前调用该方法。