2012-09-25 14 views
10

Estoy usando la clase MediaPlayer en una aplicación en la que estoy trabajando actualmente. Quiero aferrarme a una instancia de la clase MediaPlayer durante toda la vida de mi actividad. Estoy liberando los recursos de la clase MediaPlayer en el método de la actividad onPause() {}, sin embargo, cuando se inicia la actividad Veo el siguiente aviso pop-up en la ventana LogCat:Android: MediaPlayer finalizado sin haber sido lanzado

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

Cualquier idea de lo que estoy haciendo mal aquí o cómo eliminar esta advertencia? No parece causar ningún problema y el sonido funciona bien.

Tengo un poco demasiado código para publicar porque envolví algunos objetos para permitir que se administre el estado (la clase MediaPlayer no proporciona actualmente información de estado), y varias otras razones, pero el código es más o menos:

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

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

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

Con este método en mi clase SoundManager:

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

Y en initialiseSounds estoy haciendo:

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

Cuando quiero reproducir la pista que hago:

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

agradecería cualquier consejo,

Gracias,

+0

¿Puede incluir los fragmentos de código relevantes de lo que está haciendo a mediaplayer en onCreate/onResume/onPause, etc.? "liberar los recursos" podría interpretarse de manera un tanto ambigua. – Tim

+0

@Tim Hola Tim, he agregado un código a la pregunta, ¡gracias! – magritte

Respuesta

17

no estoy completamente seguro del origen de ese mensaje, pero noto aquí que está creando dos MediaPlayers: uno en onCreate y otro en onResume.

Ese mensaje parece indicar que no le gusta que un MP se esté finalizando (GC'd) sin ser 'liberado'. Puede estar refiriéndose a ese primer mediaPlayer que creaste en onCreate, que se pierde después de que lo reasignes en onResume.

¿Quizás el error desaparecerá si solo creas un MediaPlayer en lugar de dos?

+0

Ah, quizás tengas razón, echaré un vistazo a eso gracias – magritte

+1

¡Golpeas la uña en la cabeza! Gracias hombre. – magritte

1

He encontrado un problema similar Llamar al método en onStart() o onResume, no lo invoque en onCreate().

1

Este mensaje también aparece si no llamas la liberación en el objeto del reproductor multimedia y tu fragmento se detiene y se destruye.

Debe sobrescribir onStop() o uno de los otros métodos y liberar llamada() en el reproductor multimedia.

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