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()
是异步的。
我使用了以下代码:
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()
是异步的。