gpt4 book ai didi

android - ExoPlayer发布后如何重新初始化?

转载 作者:行者123 更新时间:2023-12-02 13:36:34 27 4
gpt4 key购买 nike

我有 ExoPlayerWrapper 类,它是 ExoPlayer 的包装器,由 Dagger 单例注入(inject)。 ExoPlayerWrapper 类中的初始化 block 如下所示:

@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
}

ActivityonCreate() 方法中,我有以下代码:

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 的 OnClickListener:

backBtn.setOnClickListener{ _ ->
player.pause()
finish()
}

一切正常,点击 backBtn 按钮后可以播放其他视频。因此,在 release() 方法调用之后重新初始化 ExoPlayer 似乎是个问题。 ExoPlayer 发布后如何正确重新初始化?

UPD在调用 release() 并尝试再次打开视频后,我在 Logcat 中看到以下错误:

java.lang.IllegalStateException: Handler (android.os.Handler) {81fa8ef} sending message to a Handler on a dead thread
at android.os.MessageQueue.enqueueMessage(MessageQueue.java:545)
at android.os.Handler.enqueueMessage(Handler.java:661)
at android.os.Handler.sendMessageAtTime(Handler.java:630)
at android.os.Handler.sendMessageDelayed(Handler.java:600)
at android.os.Handler.sendMessage(Handler.java:537)
at android.os.Message.sendToTarget(Message.java:418)
at com.google.android.exoplayer2.ExoPlayerImplInternal.stop(ExoPlayerImplInternal.java:207)
at com.google.android.exoplayer2.ExoPlayerImpl.stop(ExoPlayerImpl.java:357)
at com.google.android.exoplayer2.SimpleExoPlayer.stop(SimpleExoPlayer.java:777)
at com.google.android.exoplayer2.SimpleExoPlayer.stop(SimpleExoPlayer.java:772)
at package.ExoPlayerWrapper.stop(ExoPlayerWrapper.kt:xx)
at package.ExoPlayerWrapper.reset(ExoPlayerWrapper.kt:xx)
at package.ExoPlayerWrapper.playFromUrl(ExoPlayerWrapper.kt:xx)
at package.VideoPlayerActivity.onCreate(VideoPlayerActivity.kt:xx)

最佳答案

此问题是由于尝试使用资源已被释放的播放器而产生的。因为:

exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector)

仅在 ExoPlayerWrapper 初始化期间被调用一次。如果您的 Activity 没有重新启动,那么 ExoPlayerWrapper 的实例将与已释放的播放器保持一致。

要么在每次播放视频时创建一个新的 ExoPlayerWrapper 实例,要么在 ExoPlayerWrapper 中创建一个播放器初始化方法,您可以在播放视频之前调用它.

关于android - ExoPlayer发布后如何重新初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55298555/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com