Zarządzanie stanem i zasobami MediaPlayer

Ten dokument dotyczy 2 obszarów, w których mogą pojawić się potencjalne problemy.

  • Stan W przypadku „Medialayer” niektóre operacje są prawidłowe tylko w określonych stanach. Nieprawidłowe operacje mogą powodować wyjątki lub nieoczekiwane działanie.

  • Zasoby Gdy wprowadzasz zmiany w konfiguracji, takie jak obracanie ekranu, musisz zwolnić obiekt MediaPlayer, aby zwolnić zasoby systemowe i uniknąć ich wyczerpania.

Zarządzanie stanem

MediaPlayer zależy od stanu. Oznacza to, że ma on wewnętrzny stan, o którym musisz pamiętać podczas pisania kodu, ponieważ niektóre operacje są ważne tylko wtedy, gdy odtwarzacz znajduje się w określonych stanach. Jeśli wykonasz operację w niewłaściwym stanie, system może wyrzucić wyjątek lub spowodować inne niepożądane zachowania.

Diagram stanów w dokumentacji klasy MediaPlayer wyjaśnia, które metody przenoszą obiekt MediaPlayer z jednego stanu do drugiego. Przykład:

  • Gdy tworzysz nowy element MediaPlayer, jest on w stanie nieaktywny.
  • Inicjalizacja następuje przez wywołanie funkcji setDataSource(), która zmienia stan na Zainicjowany.
  • Możesz go przygotować za pomocą metody prepare() lub prepareAsync().
  • Gdy MediaPlayer zakończy przygotowywanie, wejdzie w stan Prepared, co oznacza, że możesz wywołać start(), aby odtworzyć media.

W tym momencie, jak pokazuje diagram, możesz przechodzić między stanami Started, PausedPlaybackCompleted, wywołując takie metody jak start(), pause()seekTo().

Pamiętaj, że po wywołaniu funkcji stop() nie możesz ponownie wywołać funkcji start(), dopóki nie przygotujesz ponownie funkcji MediaPlayer.

Podczas pisania kodu, który współpracuje z obiektem MediaPlayer, zawsze miej na uwadze diagram stanów, ponieważ wywoływanie metod obiektu w niewłaściwym stanie jest częstą przyczyną błędów.

zwalnianie MediaPlayer

MediaPlayer może zużywać cenne zasoby systemu. Dlatego zawsze należy zachować szczególną ostrożność, aby nie przechowywać instancji MediaPlayer dłużej niż to konieczne. Po zakończeniu pracy zawsze należy wywołać funkcję release(), aby upewnić się, że wszystkie przydzielone mu zasoby systemowe zostały zwolnione.

Jeśli np. używasz komponentu MediaPlayer, a Twoja aktywność otrzymuje wywołanie onStop(), musisz zwolnić komponent MediaPlayer, ponieważ nie ma sensu utrzymywanie go, gdy aktywność nie wchodzi w interakcję z użytkownikiem (chyba że odtwarzasz media w tle, co jest omawiane w następnej sekcji).

Gdy aktywność zostanie wznowiona lub wznowisz ją, musisz utworzyć nowy MediaPlayer i ponownie go przygotować przed wznowieniem odtwarzania.

Oto jak należy opublikować i unieważnić MediaPlayer:

Kotlin

mediaPlayer?.release()
mediaPlayer = null

Java

mediaPlayer.release();
mediaPlayer = null;

Wyobraź sobie na przykład, jakie problemy mogą wystąpić, jeśli zapomnisz zwolnić blokadę MediaPlayer, gdy aktywność się zakończy, ale utworzysz nową, gdy aktywność zostanie wznowiona. Gdy użytkownik zmieni orientację ekranu (lub w inny sposób zmieni konfigurację urządzenia), system domyślnie ponownie uruchomi aktywność. Gdy użytkownik będzie przełączać się między orientacją poziomą i pionową, możesz szybko zużyć wszystkie zasoby systemowe, ponieważ przy każdym zmianie orientacji tworzysz nowy element MediaPlayer, którego nigdy nie zwalniasz.

Więcej informacji o ponownym uruchamianiu środowiska wykonawczego znajdziesz w artykule Zarządzanie zmianami w środowisku wykonawczym.

Możesz się zastanawiać, co się stanie, jeśli chcesz kontynuować odtwarzanie „multimediów w tle” nawet wtedy, gdy użytkownik opuści Twoją aktywność, podobnie jak w przypadku wbudowanej aplikacji Muzyka. W tym przypadku potrzebujesz MediaPlayer kontrolowanego przez usługę, jak opisano w następnej sekcji.

Więcej informacji

Jetpack Media3 to zalecane rozwiązanie do odtwarzania multimediów w aplikacji. Więcej informacji

Na tych stronach znajdziesz informacje na temat nagrywania, przechowywania i odtwarzania dźwięku i obrazu: