Android: MediaPlayer завершился без выпуска

Я использую класс MediaPlayer в приложении, над которым я сейчас работаю. Я хочу удержать экземпляр класса MediaPlayer для жизни моего действия. Я освобождаю ресурсы класса MediaPlayer в методе onPause() {}, но когда начинается действие, я вижу, что в окне LogCat появляется следующее предупреждение:

W/MediaPlayer-JNI(16795): MediaPlayer finalized without being released

Любая идея, что я делаю неправильно здесь или как удалить это предупреждение? Кажется, что это не вызывает никаких проблем, и звук работает нормально.

У меня слишком много кода для публикации, потому что я обернул несколько объектов, чтобы разрешить управление состоянием (класс MediaPlayer в настоящее время не предоставляет информацию о состоянии) и различные другие причины, но код в значительной степени:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    initialiseSounds(this);
}

@Override
protected void onPause()
{
    soundManager.releaseResources();
}

@Override
protected void onResume()
{
    initialiseSounds(this);
}

С помощью этого метода в моем классе SoundManager:

public void releaseResources()
{
    player.release();
}

И в initialiseSounds я делаю:

MediaPlayer player = new MediaPlayer();
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor assetFileDescriptor = context.getResources().openRawResourceFd(resourceId);
setDataSource(player, assetFileDescriptor);

Когда я хочу воспроизвести трек, я делаю:

player.prepare();
player.start();

Оцените любые советы,

Спасибо,

Ответ 1

Я не совсем уверен в происхождении этого сообщения, но обратите внимание на то, что вы создаете два MediaPlayers: один в onCreate и один в onResume.

Это сообщение, похоже, указывает, что не нравится, что MP завершается (GC'd), не будучи "выпущенным". Это может быть ссылка на тот первый MediaPlayer, который вы создаете в onCreate, который теряется после переназначения его в onResume.

Возможно, ошибка исчезнет, ​​если вы создадите только один MediaPlayer вместо двух?

Ответ 2

Я встретил аналогичную проблему. Вызовите метод в onStart() или onResume, не вызывайте его в onCreate().

Ответ 3

Это сообщение также появляется, если вы не вызываете выпуск на объекте медиаплеера, и ваш фрагмент остановлен и уничтожен.

Вам нужно переопределить onStop() или один из других методов и вызвать release() на медиаплеере.

@Override
public void onStop() {
    super.onStop();
    mediaPlayer.stop();
    mediaPlayer.release();
}