所以我有一个简单的音板类型应用程序,它通过ListView进行操作。点按一个项目,它会播放声音。我有一个名为soundResourceList的public static int [],其条目如R.raw.foo,R.raw.bar与ListView中与文本相关的条目的顺序相同。
此代码适用于包括我自己在内的许多用户,但最近发布了一个NullPointerException,特别是来自setOnCompletionListener行。这对我来说意味着MediaPlayer.create返回null,但我无法弄清楚为什么它会在他们的设备上失败而不是其他人的。
public void onListItemClick(ListView parent, View v, int position, long id) {
MediaPlayer mp = MediaPlayer.create(getBaseContext(), soundResourceList[position]);
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
}
通常情况下,使用MediaPlayer的NPE是由于没有发布其先前的实例,但我已经按照代码中的说明处理了该问题。那么我错过了什么可能导致MediaPlayer.create()失败?
答案 0 :(得分:2)
create方法文档说:
Returns
a MediaPlayer object, or null if creation failed
由于可能会为每个MediaPlayer分配许多低级资源,因此如果GC暂停一段时间或者没有运行,您可能会耗尽声音缓冲区(或其他任何内容)和MediaPlayer分配将失败,返回null。
如果这些都是相对较短的音频片段,您可以查看android.media.SoundPool。