Как повторно инициализировать ExoPlayer после выпуска? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть класс ExoPlayerWrapper, который является оберткой для ExoPlayer и вводится одиночно Dagger . Блок init в классе ExoPlayerWrapper выглядит следующим образом:

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

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)

1 Ответ

0 голосов
/ 22 марта 2019

По вашему требованию нет необходимости использовать метод выпуска. Если вы используете этот метод, вы должны заново инициализировать exoplayer.

Вы можете использовать метод stop (), чтобы остановить exoplayer.

...