Как мне справиться с фоновым приложением, чтобы восстановить Exoplayer, который я добавляю в Dagger2? - PullRequest
0 голосов
/ 13 января 2019

У меня есть фрагмент, который содержит экземпляр 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();
            }

1 Ответ

0 голосов
/ 13 января 2019

Кинжал не создаст новый экземпляр, если я не пропущу способ, как это сделать.

Если все, что вам нужно, это каждый раз получать новый экземпляр от Dagger, то вам нужно ввести Provider<SimpleExoPlayer> и вызвать provider.get(), когда вам нужен новый объект.

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

...