Gestire lo stato e le risorse di MediaPlayer

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() o prepareAsync().
  • Al termine della preparazione, MediaPlayer 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.

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: