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()
lubprepareAsync()
. - Gdy
MediaPlayer
zakończy przygotowywanie, wejdzie w stanPrepared
, co oznacza, że możesz wywołaćstart()
, aby odtworzyć media.
W tym momencie, jak pokazuje diagram, możesz przechodzić między stanami Started
,
Paused
i PlaybackCompleted
, wywołując takie metody jak start()
, pause()
i 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: