Как мне справиться с фоновым приложением, чтобы восстановить Exoplayer, который я добавляю в Dagger2?
У меня есть фрагмент, который содержит экземпляр Exoplayer, который я поставляю с Dagger 2 следующим образом:@Inject SimpleExoPlayer mPlayer;
По большей части это работает хорошо, я могу проигрывать вещи на своем плеере, состояние корректно восстанавливается при изменениях жизненного цикла и т. Д.
Проблема, с которой я столкнулся, заключается в том, что, когда я нажимаю кнопку "Обзор", перехожу к другому приложению и затем возвращаюсь, проигрыватель находится в состоянии черного экрана, где панель поиска была восстановлена в сохраненном положении, но ничего не воспроизводится, и не отвечает на команды воспроизведения в интерфейсе пользователя, а просто остается черным, пока фрагмент не будет воссоздан.
Сейчас я пытаюсь что-то изменить, чтобы мой код работал с плеером, как в этой лаборатории кода:
private void releasePlayer() {
if (player != null) {
playbackPosition = player.getCurrentPosition();
currentWindow = player.getCurrentindowIndex();
playWhenReady = player.getPlayWhenReady();
player.release();
player = null;
}
}
который должен быть вызван в onStop()
выше API 23.
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, предпочтительно с фрагментом? Также пролить немного света на это, пожалуйста:)
РЕДАКТИРОВАТЬ: Решено благодаря @ Дэвид Меденжак
После подсказки об использовании провайдера<> я решил проблему с помощью: @Inject Provider<SimpleExoPlayer> mSimpleExoPlayerProvider
А также:SimpleExoPlayer mPlayer
Поэтому, когда я инициализирую плеер внутри onStart
Я получу новый экземпляр Player от провайдера, если к mPlayer не подключен ни один экземпляр, и удерживаю этот экземпляр Player до тех пор, пока onStop
где я установил mPlayer на ноль.
if (mPlayer == null) {
// Get new instance of player if mPlayer is null
mPlayer = mSimpleExoPlayerProvider.get();
}
1 ответ
Кинжал не создаст новый экземпляр, если я не пропущу способ, как это сделать.
Если все, что вы хотите сделать, это каждый раз получать новый экземпляр от Dagger, то вам следует ввести Provider<SimpleExoPlayer>
и позвонить provider.get()
когда вам нужен новый объект.
Чтобы это работало, игрок должен быть без прицела, иначе вы будете получать один и тот же объект каждый раз.