Android 应用程序突然强制关闭

Android 应用程序突然强制关闭,android,Android,我创建了一个音乐应用程序。该应用程序有16个音乐BTN。该应用程序运行时没有问题,但当我多次按下BTN时,该应用程序强制关闭 super.onCreate(icicle); setContentView(R.layout.main); int[] ids = {R.id.btn,R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5, R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9,

我创建了一个音乐应用程序。该应用程序有16个音乐BTN。该应用程序运行时没有问题,但当我多次按下BTN时,该应用程序强制关闭

     super.onCreate(icicle);
        setContentView(R.layout.main);  
        int[] ids = {R.id.btn,R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5, R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9, R.id.btn10,
                R.id.btn11, R.id.btn12, R.id.btn13, R.id.btn14, R.id.btn15, R.id.btn16 };



            for (int i : ids) {
                b =  (Button) findViewById(i);
                b.setOnClickListener(this);
            }}
      //outside of onCreate()
        @Override
        public void onClick(View v) {

            switch(v.getId()) {
                case R.id.btn:
                     if (mp != null && mp.isPlaying()) mp.stop();
                    mp = MediaPlayer.create(zoo.this, R.raw.gata);
                    mp.start();
                    break;
这是每个btn的代码和用例。当应用程序强制关闭时,logCat在mp.start中发现一个NullPointerException;关闭应用程序的按钮。请帮助

从下面的评论中编辑:

case R.id.btn: 
    if (mp != null && mp.isPlaying()) mp.stop(); 
    mp.reset(); 
    try { 
        mp.setDataSource("zoo.this,R.raw.gata"); 
    } catch (IllegalArgumentException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
    } catch (IllegalStateException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
    } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
    }
    mp.start(); 
    break;

我认为关键是MediaPlayer是一个相当重要的资源,你不应该创建太多。另外,一旦您完成了它,就调用它的release方法。Anon的观点都是正确的:您应该尝试重新使用您的媒体播放,而不是创建新的媒体播放,并且您应该非常熟悉MediaPlayer文档。例如,从MediaPlayer文档中:

资源可能包括单例 硬件等资源 加速部件和故障诊断 呼叫释放可能会导致后续故障 MediaPlayer对象的实例 回退到软件实现 或者完全失败


假设您正在分配大量MediaPlayer对象,并且/或者没有足够快地释放它们。但是,如果没有更多的代码,就无法确定。

是否需要在每次按下按钮时创建一个新的MediaPlayer?这个类有reset和setDataSource方法是有原因的。对不起,我是android开发的新手!我如何修复它?请看一下该课程的文档。我可以得到更多帮助吗?…case R.id.btn:if mp!=null&&mp.isPlaying mp.stop;mp.reset;请尝试{mp.setDataSourcezoo.this,R.raw.gata;}捕获IllegalArgumentException e1{//TODO自动生成的捕获块e1.printStackTrace;}捕获IllegalStateException e1{//TODO自动生成的捕获块e1.printStackTrace;}捕获IOException e1{//TODO自动生成的catch block e1.printStackTrace;}mp.start;break;