2010-08-20 5 views
1

Je comprends que le système peut tuer l'activité sans appeler onDestroy(). Dire que j'ai un MediaPlayer qui s'exécute même quand il n'est pas visible, je libèrerais le lecteur dans la méthode onDestroy().Android: Libération des ressources dans onDestroy(); méthode

Maintenant, si le système décide de tuer l'activité après avoir appelé onPause() et n'a jamais appelé onDestroy(), qu'est-ce que cela signifie pour mon MediaPlayer? Est-il jamais sorti? C'est un plus gros problème pour Camera car je pense qu'il faut être libéré pour que d'autres activités puissent l'utiliser.

Répondre

1

Il est très très rare que vous deviez conserver les médias à partir d'une activité après onPause(). Vous devriez certainement le libérer car cela créera des fuites. Au lieu de cela, votre média doit être lu dans un service qui ne possède pas les problèmes onPause() (un service est en cours d'exécution ou non), puis votre activité s'interface avec le service.

+0

Oui, l'utilisation d'un service est logique! mais j'essayais juste de le simplifier en utilisant un mediaplayer (je ne devrais pas le deviner) Un meilleur scénario est quand la caméra est ouverte pour l'aperçu de MediaRecorder dans l'activité vidéo principale et si vous voulez une autre activité de transparence sur haut de la page avec l'aperçu de la caméra encore visible ci-dessous. Je crois que le framework appellera seulement onPause() puis onStop() sur l'activité principale. Donc, si le framework décide maintenant de tuer l'activité principale et d'ignorer onDestroy(), la caméra n'est jamais libérée - est-ce exact? Y a-t-il une solution de contournement pour garantir camera.release()? – dzeikei

+1

Vous avez raison. La caméra doit être libérée onPause(). Il y a une raison. Si vous «contrôlez» quelle activité est affichée en haut de votre aperçu. Vous ne pouvez pas contrôler quand un service ou plus encore, le système appelle une autre activité en raison d'une diffusion du système qui a besoin de l'appareil photo ou du service de musique. Dans ce cas, le système est très en colère contre vous pour ne pas avoir libéré l'appareil photo :) Vous devez éviter d'afficher une autre activité sur l'aperçu de la caméra. A la place, utilisez getWindowManager(). AddView() pour ajouter ce qui ressemble à une nouvelle activité. – Moncader

+0

Merci! Ça me dérangeait toute la journée :) – dzeikei

Questions connexes