Gestire lo stato e le risorse di MediaPlayer

Questo documento tratta 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.

Gestire lo stato

MediaPlayer è basato sullo stato. Ovvero, ha uno stato interno di cui devi sempre essere a conoscenza quando scrivi il codice, perché alcune operazioni sono valide solo quando il player si trova in stati specifici. Se esegui un'operazione nello 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, si trova nello stato Idle.
  • Lo inizializzi chiamandosetDataSource(), che lo porta allo stato Initialized.
  • Lo prepari utilizzando il metodo prepare() o prepareAsync().
  • Quando il MediaPlayer ha terminato la preparazione, entra nello stato Prepared, il che significa che puoi chiamare start() 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.

Quando chiami stop(), tieni presente che non puoi chiamare di nuovo start() finché non prepari di nuovo MediaPlayer.

Tieni sempre presente il diagramma di stato quando scrivi codice che interagisce con un oggetto MediaPlayer, perché la chiamata dei suoi metodi dallo stato errato è 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 mantenere un' MediaPlayer istanza più a lungo del necessario. Al termine, devi sempre chiamare release() per assicurarti che tutte le risorse di sistema allocate vengano rilasciate correttamente.

Ad esempio, se utilizzi un MediaPlayer e la tua attività riceve una chiamata a onStop(), devi rilasciare MediaPlayer, perché ha poco senso mantenerlo mentre la tua attività non interagisce con l'utente (a meno che tu non stia riproducendo contenuti multimediali in background, argomento trattato nella sezione successiva).

Quando l'attività viene ripresa o riavviata, ovviamente, devi creare un nuovo MediaPlayer e prepararlo di nuovo prima di riprendere la riproduzione.

Ecco come rilasciare e poi impostare su null MediaPlayer:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

Ad esempio, considera i problemi che si verificano se dimentichi di rilasciare il MediaPlayer quando l'attività si interrompe, ma ne crei uno nuovo quando l' attività riprende. Quando l'utente modifica l'orientamento dello schermo (o modifica la configurazione del dispositivo in un altro modo), il sistema riavvia l'attività per impostazione predefinita. Potresti consumare rapidamente tutte le risorse di sistema mentre l'utente ruota il dispositivo avanti e indietro tra verticale e orizzontale, perché a ogni cambio di orientamento crei un nuovo MediaPlayer che non rilasci mai.

Per ulteriori informazioni sui riavvii di runtime, vedi Gestire le modifiche di runtime.

Ti starai chiedendo cosa succede se vuoi continuare a riprodurre "contenuti multimediali in background" anche quando l'utente esce dalla tua attività, proprio come si comporta l'applicazione Musica integrata. In questo caso, ti serve un MediaPlayer controllato da un servizio, come descritto 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, all'archiviazione e alla riproduzione di audio e video: