Android: MediaPlayer finalisé sans être libérés
Je suis en utilisant le lecteur multimédia de la classe dans une application que je suis en train de travailler. Je veux une instance de la classe de MediaPlayer pour la durée de vie de mon Activité. Je suis en libérant les ressources à partir de la classe de MediaPlayer dans le onPause() { } la méthode de l'activité, toutefois, lorsque l'activité commence, je vois le message d'avertissement suivant apparaîtra dans le LogCat fenêtre:
W/MediaPlayer-JNI(16795): MediaPlayer finalized without being released
Une idée de ce que je fais mal ici ou comment faire pour supprimer cet avertissement? Il ne semble pas causer de problème, et le son fonctionne très bien.
J'ai un peu trop de code pour poster parce que j'ai enveloppé quelques objets à autoriser l'état à gérer (le lecteur multimédia de la classe ne dispose pas actuellement de fournir des informations d'état), et pour diverses autres raisons, mais le code est assez bien:
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initialiseSounds(this);
}
@Override
protected void onPause()
{
soundManager.releaseResources();
}
@Override
protected void onResume()
{
initialiseSounds(this);
}
Avec cette méthode dans mon SoundManager classe:
public void releaseResources()
{
player.release();
}
Et dans initialiseSounds je suis en train de faire:
MediaPlayer player = new MediaPlayer();
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor assetFileDescriptor = context.getResources().openRawResourceFd(resourceId);
setDataSource(player, assetFileDescriptor);
Quand je veux jouer le morceau que j'ai à faire:
player.prepare();
player.start();
Apprécie tous les conseils,
Merci,
- Pouvez-vous comprendre les extraits de code de ce que vous faites pour lecteur multimédia dans le onCreate/onResume/onPause, etc? "en libérant les ressources" pourrait être interprétée de manière assez ambiguë.
- Salut Tim, j'ai ajouté un peu de code pour la question, merci!
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas complètement sûr de l'origine de ce message, mais il faut noter ici que vous êtes en train de créer deux MediaPlayers: l'un dans le onCreate et un dans onResume.
Ce message semble indiquer qu'il n'aime pas qu'un MP est en cours de finalisation (GC avais) sans être "libéré". Il peut être en se référant à la première mediaPlayer vous créez dans onCreate, qui est perdue après le réaffecter dans onResume.
Peut-être l'erreur disparaîtra si vous n'créer un lecteur multimédia au lieu de deux?
Ce message s'affiche également si vous n'appelez pas communiqué sur l'objet media player et votre fragment est arrêté, et les a détruits.
Vous avez besoin de remplacer
onStop()
ou l'une des autres méthodes et appeler release() sur le lecteur multimédia.J'ai rencontré un problème similaire Appeler la méthode onStart() ou onResume , Ne l'appelez pas dans onCreate().
dans mon cas, j'ai créé local media player référence à une méthode et ce que j'ai fait ça tout le temps quand je veux jouer de l'audio, j'avais utilisé cette méthode. mais ensuite j'ai pensé qu'après le coup de cette variable locale va nettoyer la mémoire et le lecteur multimédia n'est plus accessible à cette référence.
Puis j'ai créé un mondial de Mediaplayer statique de référence et lorsque j'ai jamais créer un objet media player je initilized à cette variable statique et mon problème semble être résolu