在SoundCreate中加载Android Soundpool导致NullPointerException

时间:2015-01-15 23:50:10

标签: java android eclipse nullpointerexception soundpool

编辑:根据请求添加了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)

2 个答案:

答案 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,它工作正常。