Wpis z mikrobloga

#java #programowanie #androiddev Potrzebuję przy pomocy refleksji dostać się do obiektu klasy MediaPlayer. Znam Javę nieźle, ale wymiękam właśnie przy refleksjach. Zatem pytanie. Mogłby ktoś pokazać (to będzie kilka linijek) jak to zrobić? W onStop() mojej Activity odbindowuję sobie Service, więc tracę dostęp do jej metod. W onDestroy() natomiast chciałbym zatrzymać foreground i zatrzymać usługę jeśli player nic nie odtwarza, ale nie mam dostępu do metody isPlaying() klasy MediaPlayer, to znaczy mPlayer.isPlaying(). Zatem chcę się dostać tam refleksjami, bo zasadniczo, jeśli coś sobie gra w usłudze, to niech dalej gra w tle i nie ma potrzeby zatrzymywać tego. Tym sposobem piosenka sobie dogra do końca, a ja się podbinduję do usługi ponownie jak będę chciał dalej działać.
  • 6
@indywidualny: Refleksji się raczej unika przy zwykłym pisaniu, to jest bardziej jak ostateczność.
Jak się używa to najczęściej do jakiś rejestracji itd, np wyszukiwania metod z wybraną adnotacją.
Refleksje są powolne, bardzo powolne, i jak się już ich używa to koniecznie trzeba cachować metody/fieldy bo inaczej to są jeszcze wolniejsze.

A twoja metoda jest publiczna:
http://developer.android.com/reference/android/media/MediaPlayer.html#isPlaying()
A ja nie możesz się dostać do własnego obiektu który trzyma player-a, to nie potrzebujesz
@GotoFinal: Najwyraźniej macie rację. Na razie w fazie testów wszystko jest, więc jakoś to przeprojektuję w takim razie :) Myślałem o refleksjach dlatego, że szybkość tu nie gra roli. To kod, który chcę niejako dać w "destruktorze" - onDestroy(), który system sobie kiedyś tam wywołuje w tle przy finalizacji wszystkiego. Całą pracę kończę wcześniej, a to jest ostateczność i taka trochę sytuacja wyjątkowa, tzn. czy kompletnie ubić proces, czy jednak niech
@indywidualny: Refleksje na androidzie są bardzo wolne(szczególnie Android <5) w przeciwieństwie do Javy i raczej nigdy z nich nie powinno się korzystać bo może to powodować że aplikacja będzie uruchamiała się 3-4 sekundy.
kod, który chcę niejako dać w "destruktorze" - onDestroy(), który system sobie kiedyś tam wywołuje w tle przy finalizacji wszystkiego.

@indywidualny: onDestroy() to nie finalizacja, tylko element lifecycle. API wywołuje to gdy Activity lub fragment nie jest już potrzebny. Prawdopodobnie zaraz po wywołaniu onDestroy() jakieś FragmentManagery czy Activity managery usuwają swoją referencje do twego fragmentu/klasy. Dopiero po tym GC może wkroczyć. Jak będziesz za dużo robić w onDestroy() to uwolnienie pamięci