Исключение нулевого указателя, генерируемое при вызове .show () в MediaController - PullRequest
2 голосов
/ 20 апреля 2020

Я обнаружил, что этот вопрос был помечен как дубликат одного о том, как предотвратить исключения нулевого указателя. Для пояснения проблема в том, что библиотека его выбрасывает. Моя переменная не равна нулю. Подробнее c Справка о библиотеке более полезна.

Я создаю приложение для игры в музыку c. Я пытаюсь использовать класс MediaController для добавления элементов управления к воспроизводимой песне. Однако, когда я запускаю функцию .show(), я получаю исключение нулевого указателя.

Вот код для MediaController:

public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {

    MediaController timer = view.findViewById(R.id.song_progress);
    timer.setMediaPlayer(new MediaController.MediaPlayerControl() {
        @Override
        public void start() {
            MainActivity.playingSong.start();
        }

        @Override
        public void pause() {
            MainActivity.playingSong.pause();
        }

        @Override
        public int getDuration() {
            return MainActivity.playingSong.getDuration();
        }

        @Override
        public int getCurrentPosition() {
            return MainActivity.playingSong.getCurrentPosition();
        }

        @Override
        public void seekTo(int pos) {
            MainActivity.playingSong.seekTo(pos);
        }

        @Override
        public boolean isPlaying() {
            return MainActivity.playingSong.isPlaying();
        }

        @Override
        public int getBufferPercentage() {
            return 0;
        }

        @Override
        public boolean canPause() {
            return true;
        }

        @Override
        public boolean canSeekBackward() {
            return true;
        }

        @Override
        public boolean canSeekForward() {
            return true;
        }

        @Override
        public int getAudioSessionId() {
            return MainActivity.playingSong.getAudioSessionId();
        }
    });
    timer.setAnchorView(view);
    timer.setEnabled(true);
    timer.show();

}

Вот журнал ошибок:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.luner.mobilemusic, PID: 2021
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.measure(int, int)' on a null object reference
        at android.widget.MediaController.updateFloatingWindowLayout(MediaController.java:173)
        at android.widget.MediaController.show(MediaController.java:363)
        at android.widget.MediaController.show(MediaController.java:314)
        at com.luner.mobilemusic.Playlist$Song$PlayFragment.onViewCreated(Playlist.java:271)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7156)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

Почему это происходит? Есть ли хороший способ исправить это, или я должен использовать другой класс полностью? Я был бы очень признателен за любые примеры кода, которые у вас могут быть.

Кроме того, я обнаружил, что удаление setAnchorView(view) предотвращает ошибку, но затем не вызывает MediaController.

Редактировать

После более тщательного поиска я обнаружил две вещи:

  1. Номера строк по какой-то причине не точны; строка для updateFloatingWindowLayout появилась внутри другого метода.

  2. Виновной является переменная mDecor, которая при запуске метода setAnchorView устанавливается в переменную представления. Однако переменная представления не может быть null, так как это вызвало бы исключение перед тем, как перейти к функции show. Таким образом, я все еще не могу выяснить источник этого ... переменная mDecor должна где-то быть установлена ​​на null, но только когда я добавляю пользовательское представление привязки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...