Java.lang.StackOverflowError: размер стека 8 МБ в студии Android. Как это решить?

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

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.user.brain_storming, PID: 11742
    java.lang.StackOverflowError: stack size 8MB
        at com.example.user.brain_storming.MusicService$1.onError(MusicService.java:48)
        at com.example.user.brain_storming.MusicService$1.onError(MusicService.java:48)

И я проверил код, строка 48 - это

    mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

        public boolean onError(MediaPlayer mp, int what, int
                extra) {

            onError(mPlayer, what, extra);
            return true;
        }
    });

Я не знаю, как это решить, и мне пришлось включить расширенное профилирование, поскольку я ссылаюсь на этот веб-сайт. Но не работает =(

InputConnectionWrapper.commitText StackOverflowError в устройствах HTC

Приведенный ниже код является кодом моего музыкального сервиса.

public class MusicService extends Service implements MediaPlayer.OnErrorListener {

    private final IBinder mBinder = new ServiceBinder();
    MediaPlayer mPlayer;
    private int length = 0;

    public MusicService() {
    }

    public class ServiceBinder extends Binder {
        MusicService getService() {
            return MusicService.this;
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mPlayer = MediaPlayer.create(this, R.raw.play);
        mPlayer.setOnErrorListener(this);

        if (mPlayer != null) {
            mPlayer.setLooping(true);
            mPlayer.setVolume(50, 50);
        }


        /*mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

            public boolean onError(MediaPlayer mp, int what, int
                    extra) {

                onError(mPlayer, what, extra);
                return true;
            }
        });*/
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (mPlayer != null) {
            mPlayer.start();
        }
        return START_NOT_STICKY;
    }

    public void pauseMusic() {
        if (mPlayer != null) {
            if (mPlayer.isPlaying()) {
                mPlayer.pause();
                length = mPlayer.getCurrentPosition();
            }
        }
    }

    public void resumeMusic() {
        if (mPlayer != null) {
            if (!mPlayer.isPlaying()) {
                mPlayer.seekTo(length);
                mPlayer.start();
            }
        }
    }

    public void startMusic() {
        mPlayer = MediaPlayer.create(this, R.raw.play);
        mPlayer.setOnErrorListener(this);

        if (mPlayer != null) {
            mPlayer.setLooping(true);
            mPlayer.setVolume(50, 50);
            mPlayer.start();
        }

    }

    public void stopMusic() {
        if (mPlayer != null) {
            mPlayer.stop();
            mPlayer.release();
            mPlayer = null;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mPlayer != null) {
            try {
                mPlayer.stop();
                mPlayer.release();
            } finally {
                mPlayer = null;
            }
        }
    }

    public boolean onError(MediaPlayer mp, int what, int extra) {

        Toast.makeText(this, "Music player failed", Toast.LENGTH_SHORT).show();
        if (mPlayer != null) {
            try {
                mPlayer.stop();
                mPlayer.release();
            } finally {
                mPlayer = null;
            }
        }
        return false;
    }
}

Похоже, этот метод вызывает себя бесконечно.

Eran 03.04.2019 09:38

Пожалуйста, не помечайте вопросы тегом android-studio только потому, что вы его используете: тег Android Studio следует использовать только тогда, когда у вас есть вопросы о самой IDE, а не о коде, который вы пишете (или хотите написать) в ней.

Zoe 03.04.2019 09:46

Внутри метода onError вы снова вызываете себя. Вот почему вы получаете StackOverflowError.

Son Truong 03.04.2019 09:55

@Эран Дун знает. Когда я учусь добавлять фоновую музыку и онлайн, научите меня этому

Steven Yu 03.04.2019 09:56

@Зои Извини. Я упомяну это в следующий раз

Steven Yu 03.04.2019 09:59

@Tommy Так я должен прокомментировать эту строку? onError(mPlayer, what, extra);

Steven Yu 03.04.2019 10:00

Это основано на ваших достижениях, если вы хотите обрабатывать ошибки, поместите туда свой код. В противном случае просто удалите mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { public boolean onError(MediaPlayer mp, int what, int extra) { onError(mPlayer, what, extra); return true; } });.

Son Truong 03.04.2019 10:04

@Tommy Но это на что-нибудь повлияет? Если я закомментирую этот код?

Steven Yu 03.04.2019 10:13

Можешь показать свой MusicService класс?

Son Truong 03.04.2019 10:17

@Tommy Я добавляю этот класс в отредактированный пост

Steven Yu 03.04.2019 10:29

@JohnLee Пожалуйста, посмотрите мой ответ.

Son Truong 03.04.2019 10:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
6 518
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема: Вы вызываете неверный onError метод. Вместо этого вы должны вызвать onError из MusicService.

Решение: Измените свой код с

mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

    public boolean onError(MediaPlayer mp, int what, int
            extra) {
        onError(mPlayer, what, extra);
        return true;
    }
});

к

mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {

    public boolean onError(MediaPlayer mp, int what, int
            extra) {
        // Calling onError of MusicService instead this onError method.
        MusicService.this.onError(mPlayer, what, extra);
        return true;
    }
});

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