Questo documento illustra due aree con potenziali insidie.
Stato. Con "Medialayer", alcune operazioni sono valide solo in stati specifici. Operazioni errate possono causare eccezioni o comportamenti imprevisti.
Risorse Quando apporti modifiche alla configurazione, ad esempio la rotazione dello schermo, devi rilasciare un oggetto
MediaPlayer
per liberare le risorse di sistema ed evitare l'esaurimento delle risorse.
Gestisci stato
MediaPlayer
si basa sullo stato. In altre parole, ha un stato interno che devi sempre tenere presente quando scrivi il codice, perché alcune operazioni sono valide solo quando il player è in stati specifici. Se esegui un'operazione mentre
lo stato è errato, il sistema potrebbe generare un'eccezione o causare altri comportamenti
indesiderati.
Il diagramma di stato nella documentazione della classe MediaPlayer
chiarisce
quali metodi spostano MediaPlayer
da uno stato all'altro. Ad esempio:
- Quando crei un nuovo
MediaPlayer
, questo è nello stato Inattivo. - Lo puoi inizializzare chiamando
setDataSource()
, che lo imposta sullo stato Initialized. - Puoi prepararlo utilizzando il metodo
prepare()
oprepareAsync()
. - Al termine della preparazione,
MediaPlayer
entra nello statoPrepared
, il che significa che puoi chiamarestart()
per riprodurre i contenuti multimediali.
A questo punto, come illustrato nel diagramma, puoi passare dagli stati Started
,
Paused
e PlaybackCompleted
chiamando metodi come
start()
, pause()
e seekTo()
, tra gli altri.
Tuttavia, quando chiami stop()
, tieni presente che non puoi chiamare di nuovo start()
fino a quando non prepari di nuovo il MediaPlayer
.
Tieni sempre presente il diagramma di stato quando scrivi codice che interagisce con un oggetto MediaPlayer
, perché chiamare i relativi metodi dallo stato sbagliato è una causa comune di bug.
Rilasciare MediaPlayer
Un MediaPlayer
può consumare risorse di sistema preziose. Pertanto, devi sempre adottare precauzioni aggiuntive per assicurarti di non conservare un'istanza MediaPlayer
più a lungo del necessario. Al termine,
devi sempre chiamare release()
per assicurarti che le risorse di sistema assegnate siano state rilasciate correttamente.
Ad esempio, se utilizzi un MediaPlayer
e la tua attività riceve una chiamata a onStop()
, devi rilasciare MediaPlayer
, perché non ha molto senso mantenerlo mentre la tua attività non interagisce con l'utente (a meno che tu non stia riproducendo contenuti multimediali in background, come spiegato nella sezione successiva).
Quando l'attività viene ripresa o riavviata, devi creare un nuovo
MediaPlayer
e prepararlo di nuovo prima di riprendere la riproduzione.
Ecco come rilasciare e annullare l'MediaPlayer
:
Kotlin
mediaPlayer?.release()
mediaPlayer = null
Java
mediaPlayer.release();
mediaPlayer = null;
Ad esempio, considera i problemi che si verificano se dimentichi di rilasciare il pulsante MediaPlayer
quando l'attività si interrompe, ma ne crei uno nuovo quando l'attività ricomincia. Quando l'utente cambia l'orientamento dello schermo (o la configurazione del dispositivo in un altro modo), il sistema riavvia l'attività per impostazione predefinita. Potresti consumare rapidamente tutte le risorse di sistema man mano che l'utente gira il dispositivo tra il formato verticale e quello orizzontale, perché a ogni cambio di orientamento viene creato un nuovo MediaPlayer
che non viene mai rilasciato.
Per ulteriori informazioni sui riavvii del runtime, consulta Gestione delle modifiche del runtime.
Ti starai chiedendo cosa succede se vuoi continuare a riprodurre i "contenuti multimediali in background" anche quando l'utente esce dalla tua attività, in modo simile al comportamento dell'applicazione Music integrata. In questo caso, ti serve un
MediaPlayer
controllato da un servizio, come discusso nella sezione successiva
Scopri di più
Jetpack Media3 è la soluzione consigliata per la riproduzione di contenuti multimediali nella tua app. Scopri di più.
Queste pagine trattano argomenti relativi alla registrazione, allo stoccaggio e alla riproduzione di audio e video: