我该如何处理应用程序背景来还原我用Dagger2注入的Exoplayer?

时间:2019-01-13 11:35:44

标签: dagger-2 exoplayer dagger

我有一个Fragment,其中包含Exoplayer的一个实例,该实例由Dagger 2提供,如下所示: @Inject SimpleExoPlayer mPlayer;

在大多数情况下,这可以很好地运行,我可以在播放器上播放内容,并且可以根据生命周期的变化正确恢复状态,等等。

我遇到的问题是,当我单击“概述”按钮,导航到另一个应用程序,然后返回时,播放器处于黑屏状态,其中搜索栏已还原到其保存的位置,但不会播放任何内容,也不响应UI上的播放命令,只是保持黑色直到重新创建Fragment。

我现在正尝试修改内容,以使我的代码可以与播放器打交道,就像在this code lab中一样:

private void releasePlayer() {
  if (player != null) {
    playbackPosition = player.getCurrentPosition();
    currentWindow = player.getCurrentindowIndex();
    playWhenReady = player.getPlayWhenReady();
    player.release();
    player = null;
  }
}

应在API 23以上的onStop()中调用。

initializePlayer()onStart()中被调用,它应该看起来像这样。就我而言,唯一的区别是我不创建播放器,而Dagger会在创建时为我完成。

    private void initializePlayer() {

        player = ExoPlayerFactory.newSimpleInstance(
                new DefaultRenderersFactory(this),
                new DefaultTrackSelector(), new DefaultLoadControl());

        playerView.setPlayer(player);

        player.setPlayWhenReady(playWhenReady);
        player.seekTo(currentWindow, playbackPosition);
        [...]
    }

请注意,这两个代码段均来自链接的代码实验室。

这就是我与匕首作斗争的地方。创建或重新创建片段时,一切都很好,因为Dagger将为我提供一个播放器,但是如果我在null中将播放器设置为onStop(),则该片段不会被破坏,而是恢复并仅调用onStart()和onResume(),除非我不知道如何执行此操作,否则Dagger将不会创建新实例。

谁能指出Dagger2和ExoPlayer设置的一些代码示例,最好使用Fragment? 也请对此有所了解:)

编辑:感谢@David Medenjak

在提示使用提供程序<>之后,我通过以下方法解决了该问题: @Inject Provider<SimpleExoPlayer> mSimpleExoPlayerProvider 和: SimpleExoPlayer mPlayer 因此,当我在onStart中初始化播放器时,如果没有附加到mPlayer的实例,我将从提供者那里获取播放器的新实例,并坚持使用该播放器实例util,然后在onStop中释放播放器我将mPlayer设置为null。

            if (mPlayer == null) {
                // Get new instance of player if mPlayer is null
                mPlayer = mSimpleExoPlayerProvider.get();
            }

1 个答案:

答案 0 :(得分:1)

  

Dagger不会创建新实例,除非我不知道如何做到这一点。

如果您要做的只是每次都从Dagger获取一个新实例,那么您应该注入Provider<SimpleExoPlayer>并在需要新对象时调用provider.get()

要执行此操作,玩家需要无作用域,否则您每次都会得到相同的物体。