mediaplayer.create() 和 mediaplayer.prepareAsync() 有什么区别?

What is the difference between mediaplayer.create() and mediaplayer.prepareAsync()?

我使用了以下代码:

mp = MediaPlayer.create(this, Uri.parse("file://"+filePath));
mp.start(); 

这很好用。然后我想播放文件夹

中的音乐
mp.setDataSource(this, Uri.parse("file://"+filePath));
mp.prepareAsync();
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });

这两种方法在性能上有什么不同吗?

第一种方法会占用您所在的任何线程,足以让 MediaPlayer 读取媒体的元数据并准备一些缓冲区。如果这是主应用程序线程,则意味着您的 UI 在此期间将被冻结。

当然,在主线程中创建方法初始化对象。所以它下面的代码行应该等待创建。

另一方面,prepare asynchronous 打开一个新线程来初始化对象,然后在主线程 运行 其他行时通知您 运行 下一个操作。

编辑:正如@CommonWares在评论中提到的,mp.create()是一种同时调用mp.setDataSoucer() + mp.prepare()的便捷方法

您可以检查 MediaPlayer create() source code 以查看差异:

 public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder,
        AudioAttributes audioAttributes, int audioSessionId) {

    try {
        MediaPlayer mp = new MediaPlayer();
        final AudioAttributes aa = audioAttributes != null ? audioAttributes :
            new AudioAttributes.Builder().build();
        mp.setAudioAttributes(aa);
        mp.setAudioSessionId(audioSessionId);
        mp.setDataSource(context, uri);
        if (holder != null) {
            mp.setDisplay(holder);
        }
        mp.prepare();
        return mp;
    } catch (IOException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    } catch (SecurityException ex) {
        Log.d(TAG, "create failed:", ex);
        // fall through
    }

    return null;
}

基本上 create() 调用是同步的(它在内部调用 prepare())而 prepareAsync() 是异步的。