MediaPlayer导致FC错误

问题描述:

好吧,我收到此FC错误。MediaPlayer导致FC错误

我已经完成了三次代码并尝试了两次重写。这是我能够学习的最有效的代码。但我仍然得到FC。 我将不胜感激任何帮助,因为我正尝试为我的程序播放50个左右的声音文件。每次活动在十五到二十之间。

implements OnClickListener { 
MediaPlayer mp1; 
MediaPlayer mp2; 
MediaPlayer mp3; 
MediaPlayer mp4; 
MediaPlayer mp5; 
MediaPlayer mp6; 
MediaPlayer mp7; 



public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.verbs); 

    mp1 = MediaPlayer.create(this, R.raw.play); 
    mp2 = MediaPlayer.create(this, R.raw.eat); 
    mp3 = MediaPlayer.create(this, R.raw.can); 
    mp4 = MediaPlayer.create(this, R.raw.go); 
    mp5 = MediaPlayer.create(this, R.raw.help); 
    mp6 = MediaPlayer.create(this, R.raw.practice); 
    mp7 = MediaPlayer.create(this, R.raw.use); 





    final Button button1 = (Button) findViewById(R.id.play_button); 
    button1.setOnClickListener(this); 

    final Button button2 = (Button) findViewById(R.id.eat_button); 
    button2.setOnClickListener(this); 

    final Button button3 = (Button) findViewById(R.id.can_button); 
    button3.setOnClickListener(this); 

    final Button button4 = (Button) findViewById(R.id.go_button); 
    button4.setOnClickListener(this); 

    final Button button5 = (Button) findViewById(R.id.Thelp_button); 
    button5.setOnClickListener(this); 

    final Button button6 = (Button) findViewById(R.id.pract_button); 
    button6.setOnClickListener(this); 

    final Button button7 = (Button) findViewById(R.id.use_button); 
    button7.setOnClickListener(this); 

    final Button button8 = (Button) findViewById(R.id.Back_Button); 
    button8.setOnClickListener(this); 



} 

    public void onClick(View v) { 
    switch(v.getId()) { 
    case R.id.play_button: 
     mp1.start(); 
     Toast.makeText(VerbsActivity.this, "PLAY", 
       Toast.LENGTH_LONG).show(); 
     break; 
    case R.id.eat_button: 
     mp2.start(); 
     Toast.makeText(VerbsActivity.this, "EAT", 
       Toast.LENGTH_LONG).show(); 
     break; 
    case R.id.can_button: 
     mp3.start(); 
     Toast.makeText(VerbsActivity.this, "CAN", 
       Toast.LENGTH_LONG).show(); 
     break; 
    case R.id.go_button: 
     mp4.start(); 
     Toast.makeText(VerbsActivity.this,"GO", 
       Toast.LENGTH_LONG).show(); 
     break; 
    case R.id.Thelp_button: 
     mp5.start(); 
     Toast.makeText(VerbsActivity.this,"HELP", 
       Toast.LENGTH_LONG).show(); 
     break; 
    case R.id.pract_button: 
     mp6.start(); 
     Toast.makeText(VerbsActivity.this, "PRACTICE", 
       Toast.LENGTH_LONG).show(); 
     break; 
    case R.id.use_button: 
     mp7.start(); 
     Toast.makeText(VerbsActivity.this, "USE", 
       Toast.LENGTH_LONG).show(); 
     break; 

    case R.id.Back_Button: 
     finish(); 
     break; 

    } 
} 

@Override 
protected void onDestroy() { 
     mp1.release(); 
     mp2.release(); 
     mp3.release(); 
     mp4.release(); 
     mp5.release(); 
     mp6.release(); 
     mp7.release(); 

    super.onDestroy(); 
} 

}

+5

FC的堆栈跟踪会很有用,但它已经非常清晰,您应该使用SoundPool而不是15个独立的MediaPlayers。 – 2011-02-01 15:41:47

+1

还描述了导致它崩溃的情况......它是否在启动时死掉,是否运行几分钟然后崩溃,它会在失败之前播放一定数量的声音吗? – 2011-02-01 15:47:12

你创建了太多的MediaPlayer对象,这很容易导致异常。您也在onDestroy()方法中发布它们,在许多情况下这种方法不会被调用。

更改您的代码以改为使用SoundPool。

+0

- Reuben Scratton Ian G. Clifton 我在另一篇文章中看到了关于soundpool的一些内容,但是当我开始使用Google搜索时,发现的帖子是它没有完成,人们无法使用它。由于我还没有准备好,所以我觉得自己是初学者,所以我肯定无法让它运行。至于FC类型,程序会加载,但是当我想要进入具有媒体播放器的活动时,它将FC返回到之前的活动。我已经尝试了上述方法,只使用一个媒体播放器,但它仍然是FC回到之前的活动。 – BluMouse 2011-02-02 08:30:28

+0

我想验证帖子的年龄,说它没有完成,因为他们可能只是老。我在Android 1.5-2.3上使用SoundPool时没有问题,但一次只播放一个声音。多个MediaPlayers的问题在于系统资源有限,即使在最好的情况下也可能无法创建15个资源。如果只是创建一个导致失败,那么其他事情正在发生。尝试编辑您的帖子以包含堆栈跟踪,我们应该能够提供更多帮助。 – 2011-02-02 20:54:04

哇!为什么使用这么多MediaPlayer对象?为什么没有单个mediaplayer对象,然后在单击该按钮时为其分配资源?我不知道你的应用程序做什么,但我会写上面的代码(或者它ATLEAST片段),像这样:

MediaPlayer mp1; //just have one MediaPlayer object. 

public void onClick(View v) { 
     switch(v.getId()) { 
     case R.id.n1_button: 
      if(mp1.create(this, R.raw.sound1) == NULL) { 
       Log.v(this.toString(), "Unable to create mediaplayer object."); 
      } 
      try { 
     mp1.start(); 
    } catch(IllegalStateException e) { 
     e.printStackTrace(); 
    Log.v(this.toString(), "Illegal State Exception caught in start."); 
    } 
      Toast.makeText(NounsActivity.this, "word", 
         Toast.LENGTH_LONG).show(); 
     break; 
     case R.id.n2_button: 
     if(mp1.create(this, R.raw.sound1) == NULL) { 
       Log.v(this.toString(), "Unable to create mediaplayer object."); 
     } 
     try { 
    mp1.start(); 
     } catch(IllegalStateException e) { 
    e.printStackTrace(); 
     Log.v(this.toString(), "Illegal State Exception caught in start."); 
     } 

      Toast.makeText(NounsActivity.this, "word", 
         Toast.LENGTH_LONG).show(); 
     break; and so on.... 

@Override 
    protected void onDestroy() { 
     mp1.release();  //you just need to release one mediaplayer object now. 
     super.onDestroy(); 
    } 

但在更广泛的注意事项:所有环绕这些语句,其中的MediaPlayer在trycatch语句块中被调用,并给自己带来简单调试的好处,通过copio语句打印某些内容到LogCat。您可以获得有关将调试信息打印到LogCat here和MediaPlayer文档的更多信息,其中哪些语句会引发哪个异常here

HTH,
Sriram。

该问题已经被回答,只是对Sriram的建议进行错误检查。

启动针对soundpool错误的新线程以使其更清晰。