Как мне справиться с фоновым приложением, чтобы восстановить 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() когда вам нужен новый объект.

Чтобы это работало, игрок должен быть без прицела, иначе вы будете получать один и тот же объект каждый раз.

Другие вопросы по тегам