编辑:根据请求添加了setOnLoadCompleteListener,以及加载的检查。即使
,仍然会得到相同的空指针崩溃我有六种声音效果,我在onCreate期间加载到一个声音池中。当我尝试播放这些声音时,应用程序崩溃,我得到一个NullPointerException。我经历了很多问题和教程,但我无法弄清楚错误是什么。我已经清理了项目,也重新启动了Eclipse。我知道这些声音文件是有效的,因为我之前让它们作为媒体播放器运行,它们很好,但我想将它们放在一个更合适的声音池中。
如果有人能指出我犯的错误,那将是一个很大的帮助。如有必要,将添加所需的更多信息。谢谢你的时间!
代码的相关部分:
public class MainActivity extends Activity {
SoundPool sp;
boolean loaded = false;
int dicesoundId;
int gunfire1soundId;
int smacksoundId;
int cellardoorsoundId;
int grenadesoundId;
int pageturn3soundId;
onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sp = new SoundPool(9, AudioManager.STREAM_MUSIC, 0);
sp.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
if (status == 0){
loaded = true;
}
}
});
dicesoundId = sp.load(this, R.raw.dice, 1);
gunfire1soundId = sp.load(this, R.raw.gunfire1, 1);
smacksoundId = sp.load(this, R.raw.smack, 1);
cellardoorsoundId = sp.load(this, R.raw.cellardoor, 1);
grenadesoundId = sp.load(this, R.raw.grenade, 1);
pageturn3soundId = sp.load(this, R.raw.pageturn3, 1);
导致nullpointerexception的其中一个地方的示例:
menuButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (musicOn == 1 && loaded) sp.play(pageturn3soundId, 1, 1, 0, 0, 1);
loadPage(button1link);}
}
});
musicOn设置为on,除非用户将其切换为关闭状态。只有在音乐切换时才会发生崩溃。
奇怪的是,即使我的onPause导致应用程序崩溃:
public void onPause() {
super.onPause();
if (musicOn == 1 && loaded) {
sp.release();
sp = null;
}
}
当应用程序在进入onPause时最后崩溃时的LogCat:
01-15 18:37:54.823: E/AndroidRuntime(4855): FATAL EXCEPTION: main
01-15 18:37:54.823:E / AndroidRuntime(4855):处理:com.greekwinterproductions.westwarddystopia,PID:4855 01-15 18:37:54.823:E / AndroidRuntime(4855):java.lang.RuntimeException:无法暂停活动{com .-- cut --- .MainActivity}:java.lang.NullPointerException 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.ActivityThread.performPauseActivity(ActivityThread.java:3048) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.ActivityThread.performPauseActivity(ActivityThread.java:3003) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2981) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.ActivityThread.access $ 1000(ActivityThread.java:135) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1207) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.os.Handler.dispatchMessage(Handler.java:102) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.os.Looper.loop(Looper.java:136) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.ActivityThread.main(ActivityThread.java:5001) 01-15 18:37:54.823:E / AndroidRuntime(4855):at java.lang.reflect.Method.invokeNative(Native Method) 01-15 18:37:54.823:E / AndroidRuntime(4855):at java.lang.reflect.Method.invoke(Method.java:515) 01-15 18:37:54.823:E / AndroidRuntime(4855):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785) 01-15 18:37:54.823:E / AndroidRuntime(4855):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 01-15 18:37:54.823:E / AndroidRuntime(4855):at dalvik.system.NativeStart.main(Native Method) 01-15 18:37:54.823:E / AndroidRuntime(4855):引起:java.lang.NullPointerException 01-15 18:37:54.823:E / AndroidRuntime(4855):at com.greekwinterproductions.westwarddystopia.MainActivity.onPause(MainActivity.java:3122) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.Activity.performPause(Activity.java:5335) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1233) 01-15 18:37:54.823:E / AndroidRuntime(4855):在android.app.ActivityThread.performPauseActivity(ActivityThread.java:3034)
答案 0 :(得分:1)
现在不推荐使用SoundPool构造函数,而是使用此sampl代码
AudioAttributes attr = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
pool = new SoundPool.Builder().setAudioAttributes(attr).setMaxStreams(6).build();
这是API的文档
https://developer.android.com/reference/android/media/SoundPool.Builder.html
答案 1 :(得分:0)
你解决了问题吗,regomar?我有类似的问题,我做的是, 我在课程定义中添加了一行
受保护的SoundPool sndPool;
然后我将OnCreate中的几个声音加载到这个sndPool对象中,
我也在Class
中定义protected int bgsound1;
protected int bgsound2;
protected int bgsound3;
用作特定声音的参考 然后在我的UI线程中,我可以使用我的特定bgsound调用sndPool,它工作正常。