我有一个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? 也请对此有所了解:)
在提示使用提供程序<>之后,我通过以下方法解决了该问题:
@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();
}
答案 0 :(得分:1)
Dagger不会创建新实例,除非我不知道如何做到这一点。
如果您要做的只是每次都从Dagger获取一个新实例,那么您应该注入Provider<SimpleExoPlayer>
并在需要新对象时调用provider.get()
。
要执行此操作,玩家需要无作用域,否则您每次都会得到相同的物体。