"Po przeczytaniu" Android Documentations "nadal jestem zdezorientowany i potrzebuję doœwiadczonej porady na temat przeciążonej metody setDataSource.MediaPlayer setDataSource wymaga porady dotyczącej najlepszych praktyk.
Używam komponentu MediaPlayer
w komponencie Service
w moim projekcie, który będzie odtwarzany w postaci foregroundService. Mam plik muzyczny (.mp3) w folderze res/raw
mojego apk. Aby rozpocząć grę, wiem, że muszę przygotować obiekt MediaPlayer. Ponieważ usługi w aplikacjach na Androida domyślnie używają pojedynczego procesu i głównego wątku, nie chcę, aby moi użytkownicy otrzymywali ANR podczas gdy MediaPlayer przygotowuje się sam (myślę, że plik multimedialny w folderze raw ma duży rozmiar). Następnie używam prepareAsync
zamiast prepare
(Synchronizacja). Więc nie mogę używać:
mp = MediaPlayer.create(context, R.raw.myfile);
Bo to już nazywa prepare()
wewnętrznie ale nie prepareAsync()
. Więc w zasadzie mam dwie opcje (dwa z czterech):
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
lub
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
po użyciu jednego z nich proste użycie mogę:
mp.prepareAsync();
I wreszcie moje pytania powstać że "włączając te różne metody, która jest najlepszą opcją? Czy są jakieś korzyści z drugiej strony? Czy czegoś brakuje?"
Osobiście lubię ostatnią metodę, ponieważ nie używa ona ciągów w kodzie. Nie wiem teraz, czy to liczy się z "korzyścią". – Geobits
@Geobits, unikanie stałych łańcuchów w kodzie jest dobrą praktyką, ponieważ wiem, ale 'FileDescriptor' jest tym, co android preferuje dla plików lokalnych. Dzięki za komentarz. i proponuję przeczytać mój komentarz dotyczący zaakceptowanej odpowiedzi. –