我正在开发一个简单的应用程序并使用MediaPlayer在1个活动中播放一些背景噪音。我正在阅读MediaPlayer,我不确定是否要实现OnPreparedListener来触发start()方法。每种方法的优缺点是什么?
方法1:
mediaPlayer = MediaPlayer.create(context, R.raw.sound);
mediaPlayer.setLooping(true);
mediaPlayer.start();
方法2:
mediaPlayer = MediaPlayer.create(context, R.raw.sound);
mediaPlayer.setLooping(true);
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
答案 0 :(得分:15)
根据文档,当您正在播放start()
不需要获取数据并处理数据以进行播放的本地可用资源时,调用MediaPlayer
会很有效。例如,从原始文件夹播放音频资源。
如果您尝试从远程源播放资源,最好选择OnPreparedListener()
,因为它可能涉及获取和解码媒体数据。
因此,如果您确定您的资源在本地可用且长度很短,请转到Approach 1
。否则Approach 2
将是合适的。
理想情况下,我更喜欢这个。
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
mediaPlayer.prepareAsync();
MediaPlayer
对我来说一直很棘手。所以,我建议你从developer docs开始。通过它,了解状态图。我相信它会帮助你解决许多你尚未遇到的问题。
答案 1 :(得分:1)
假设您正在播放来自internet
的视频,并且如果您直接启动播放器,它会崩溃,因为它可能因为某些internet
问题或其他问题而无法播放。如果您使用preparedlistener
,则在准备播放之前它不会启动播放器。因此,onpreparedlistener
是好的,这样你的活动就不会崩溃或行为不端。