2013-03-27 12 views
12

Buduję aplikację, która przesyła muzykę z serwera WWW. Aplikacja ma usługę pierwszoplanową, która korzysta z MediaPlayer do odtwarzania.Czy MediaPlayer powinien działać w osobnym wątku?

Mój kod jest oparty na tym przykładzie: http://developer.android.com/guide/topics/media/mediaplayer.html

W przykładzie, nic nie jest gwintowany z wyjątkiem prepareAsync() rozmowy. Martwi mnie fakt, że kiedy przeczytałem o klasie Service, znajduję tę informację:

"Uwaga: usługa działa w głównym wątku procesu hostingu - usługa nie tworzy własnego wątku i nie uruchamia się oddzielny proces (chyba że określisz inaczej) .Oznacza to, że jeśli twoja usługa będzie wykonywać intensywne prace lub operacje blokujące procesor (takie jak odtwarzanie MP3 lub praca w sieci), powinieneś utworzyć nowy wątek w usłudze, aby wykonać tę pracę Używając osobnego wątku, zmniejszysz ryzyko błędów ANR (Application Not Responding), a główny wątek aplikacji pozostanie dedykowany interakcji użytkownika z twoimi działaniami. "

Powodem, dla którego pytam, jest to, że aplikacja kilka razy (zazwyczaj po utracie połączenia) blokuje interfejs użytkownika podczas przesyłania strumieniowego audio. Całkowicie rozumiem, że interfejs użytkownika zawiesza się, jeśli usługa powoduje intensywną pracę procesora, ponieważ działanie i usługa działają w tym samym wątku. Ale czy powinienem oczekiwać, że MediaPlayer będzie tak intensywny? To znaczy, czy powinien działać w oddzielnym wątku?

+0

readh ere http://stackoverflow.com/questions/8915618/mediaplayer-in-separate-thread-vs-running-in-service-via-startforegroundground –

+1

Zdecydowanie radzę nie wykonywać żadnych blokujących połączeń z Audiomanager , MediaPlayer, AudioRecord i inne z głównego wątku aplikacji. Jeśli system audio tymczasowo ugrzęźnie - lub całkowicie przestanie odpowiadać - z jakiegoś powodu skończy się ANR w aplikacji i raportem o błędzie, który prawdopodobnie nie będzie przydatny dla nikogo. – Michael

+0

Dzięki za odpowiedź @Michael! Całkowicie się z Tobą zgadzam, że połączenia blokujące powinny być uruchamiane w osobnym wątku. Ale czy powinienem oczekiwać, że odtwarzanie multimediów zostanie zablokowane? Po prostu nie mogę znaleźć sposobu, aby powiedzieć, czy odtwarzacz multimedialny staje się "blokujący" lub co jest przyczyną tego. Dzieje się tak tylko wtedy, gdy przesyłam strumieniowo przez rtsp podczas podróży samochodem lub pociągiem. Być może zmiana wieży komórkowej może być problemem? Obecnie opieram się na MediaPlayer, aby rozwiązać ten problem, który ma większość czasu. – smult

Odpowiedz

-2

Nie, jeśli wykonujesz transfer sieciowy, powinieneś zachować go w wątku, mediaplayer nie wymaga dużych zasobów. Zachowaj to na swojej aktywności.

+1

Nie chcesz, aby twój mediaplayer był aktywny, ponieważ powinien działać, nawet jeśli działanie zostało zniszczone. Powinieneś uruchomić go w usłudze pierwszego planu. – smult

0

Czy muzyka strumieniowa może powodować zatrzymanie głównego wątku, dopóki muzyka nie zakończy przesyłania strumieniowego? To może być powód, dla którego spowalnia to działanie.

Nie jestem ekspertem i obecnie się uczę, ale warto o tym myśleć.

12

Niestety, wywołanie metody prepareAsync() jest po prostu niewystarczające, aby uniknąć monitów ANR i zawieszenia aplikacji przez kilka sekund, szczególnie jeśli odtwarzasz plik z sieci. Najlepiej jest umieścić swoją instancję MediaPlayer we własnym wątku, lub przynajmniej wykonać intensywne połączenia w module obsługi (np. mediaplayer.start()). Używam MediaPlayer od ponad roku i mogę powiedzieć, że na pewno zawiesza się po różnych połączeniach, w zależności od okoliczności.

Powiązane problemy