Ошибки потоковой передачи Exoplayer NoSuchElementExceptionat java.util.ArrayDeque.removeFirst

Я только что переключился на Exoplayer с MediaPlayer, чтобы проигрывать фоновую музыку в игровом приложении. Во время всех моих тестов казалось, что он работает нормально, но после частичного выпуска я начал видеть сбои в

crashalytics:
NoSuchElementException at java.util.ArrayDeque.removeFirst (ArrayDeque.java:264)
com.google.android.exoplayer2.ExoPlayerImpl.notifyListeners (ExoPlayerImpl.java:737)
com.google.android.exoplayer2.ExoPlayerImpl.updatePlaybackInfo (ExoPlayerImpl.java:710)
com.google.android.exoplayer2.ExoPlayerImpl.handlePlaybackInfo (ExoPlayerImpl.java:652)
com.google.android.exoplayer2.ExoPlayerImpl.handleEvent (ExoPlayerImpl.java:595)
com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage (ExoPlayerImpl.java:127)

После поиска в Google кажется, что это связано с потоками, и мне нужно вызвать его в том же потоке, в котором он был создан. Итак, на мои вопросы по моей реализации: у меня есть игра с 4-мя действиями, одно из которых - игровой раннер. основное действие иметь одно действие экзоплеера 2 иметь одно действие 3 иметь одно игровое действие создает свое собственное действие внутри игрового потока

каждый раз, когда мне нужен экзоплеер, я вызываю этот метод:

   private SimpleExoPlayer createSimpleExoPlayer(Context context, int resId, boolean repeat) {
        SimpleExoPlayer exoPlayer = new SimpleExoPlayer.Builder(context).build();
        DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,
            Util.getUserAgent(context, "appname"));
        Uri uri = RawResourceDataSource.buildRawResourceUri(resId);
        MediaSource source = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
        exoPlayer.prepare(source);
        if (repeat)
            exoPlayer.setRepeatMode(Player.REPEAT_MODE_ALL);
        //exoPlayer.setPlayWhenReady(true);
        return exoPlayer;
    }

и игрок может быть освобожден и воссоздан при переключении фоновой музыки внутри игрового цикла. Так может это быть причиной проблем? Я неправильно понял, как это работает, и, может быть, у меня должен быть только ОДИН экземпляр, или можно иметь несколько экземпляров, как я? Любые советы приветствуются.


person Andreas Andersson    schedule 14.05.2020    source источник
comment
Хорошо, я нашел журналы, в которых говорится, что я звонил не в том потоке, поэтому предположим, что проблема в моем экземпляре внутри игрового цикла, переместил его в действие игры и посмотрим, решит ли он проблему   -  person Andreas Andersson    schedule 16.05.2020
comment
Поэтому я переместил exoplayer из игрового цикла в игровую активность, которая должна выполняться в основном потоке и передавать широковещательные сообщения из игрового цикла в активность, и он удалил все журналы, но я все еще получаю ошибку сбоя в crashalytics.   -  person Andreas Andersson    schedule 17.05.2020


Ответы (1)


Проблема заключалась в том, что у меня был таймер, который вызывал exoplayer по истечении срока его действия и, следовательно, вызывал его из другого потока.

person Andreas Andersson    schedule 21.05.2020