MediaPlayer setDataSource нужен совет передового опыта

После прочтения "Медиа Воспроизведение" а также "Проигрыватель медиаДокументация Android Я все еще смущен и нуждаюсь в опытном совете оsetDataSource перегруженный метод.

Я используюMediaPlayer вService компонент в моем проекте, который будетforegroundService во время воспроизведения музыки. У меня есть музыкальный файл (.mp3) вres/raw папка моего апк. Чтобы начать играть, я знаю, что должен подготовить объект MediaPlayer. Поскольку службы в приложениях для Android по умолчанию используют один процесс и основной поток, я не хочу, чтобы мои пользователи получалиANR в то время как MediaPlayer готовится сам (подумайте, имеет ли медиа-файл в папке raw большой размер). Тогда я используюprepareAsync вместоprepare(Синхронизация). Поэтому я не могу использовать:

mp = MediaPlayer.create(context, R.raw.myfile);

Потому что это уже называетprepare() внутренне, но неprepareAsync(), Так что в основном у меня есть два варианта (два из четырех):

Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);

или же

AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();

после использования одного из них я могу просто использовать:

mp.prepareAsync();

И, наконец, у меня возникают вопросы: «Включая эти различные методы, какой из них является лучшим вариантом? Есть ли какие-то преимущества перед другим?

Ответы на вопрос(1)

Ваш ответ на вопрос