У меня есть фрагмент, который содержит экземпляр 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()
, и Фрагмент не будет уничтожен, и он будет восстановлен и только при запуске () и onResume (), Dagger не создаст новый экземпляр, если я не пропущу способ, как это сделать.
Может ли кто-нибудь указать на примеры кода для Dagger2 и ExoPlayer, предпочтительно с фрагментом?
Также пролите немного света на это, пожалуйста:)
РЕДАКТИРОВАТЬ: Решено благодаря @ Дэвид Меденжак
После подсказки об использовании провайдера <> я решил проблему с помощью:
@Inject Provider<SimpleExoPlayer> mSimpleExoPlayerProvider
А также:
SimpleExoPlayer mPlayer
Поэтому, когда я инициализирую проигрыватель внутри onStart
, я получу новый экземпляр проигрывателя от провайдера, если к mPlayer не подключен ни один экземпляр, и удерживаю его на этом экземпляре проигрывателя, когда я освобождаю проигрыватель в onStop
, где я установил mPlayer. в ноль.
if (mPlayer == null) {
// Get new instance of player if mPlayer is null
mPlayer = mSimpleExoPlayerProvider.get();
}