安卓媒体播放器OnPreparedListener

14

我正在开发一个简单的应用程序,并在一个活动中使用MediaPlayer来播放一些背景噪音。我正在阅读有关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();

        }
    });
2个回答

21
根据文档,当您播放本地可用资源且MediaPlayer无需获取数据并处理以进行播放时,调用start()非常有效。例如从原始文件夹播放音频资源。
如果您尝试播放来自远程源的资源,则最好使用OnPreparedListener(),因为它可能涉及获取和解码媒体数据。
因此,如果您确定资源已经本地可用且长度较短,请选择方法1。否则,应选择方法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 对我来说一直很棘手。因此,我建议你从开发者文档开始学习。仔细阅读并理解其状态图表。我相信这将帮助您解决许多尚未遇到的问题。


2
我的资源目前都是本地的(R.raw),但是您能否澄清一下您所说的“如果您确定资源是本地可用且长度较短”,它的意思是什么。资源需要多短才能保证可以直接调用start()正常工作? - Jason

1
假设您正在播放来自互联网的视频。如果直接启动播放器,由于某些互联网问题或其他原因,它可能无法准备好播放而崩溃。但是,如果使用preparedlistener,则只有在准备好播放时才会启动播放器。
因此,拥有onpreparedlistener非常重要,这样您的活动就不会崩溃或出现异常行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接