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();
}
}
你创建了太多的MediaPlayer对象,这很容易导致异常。您也在onDestroy()
方法中发布它们,在许多情况下这种方法不会被调用。
更改您的代码以改为使用SoundPool。
- Reuben Scratton Ian G. Clifton 我在另一篇文章中看到了关于soundpool的一些内容,但是当我开始使用Google搜索时,发现的帖子是它没有完成,人们无法使用它。由于我还没有准备好,所以我觉得自己是初学者,所以我肯定无法让它运行。至于FC类型,程序会加载,但是当我想要进入具有媒体播放器的活动时,它将FC返回到之前的活动。我已经尝试了上述方法,只使用一个媒体播放器,但它仍然是FC回到之前的活动。 – BluMouse 2011-02-02 08:30:28
我想验证帖子的年龄,说它没有完成,因为他们可能只是老。我在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在try
和catch
语句块中被调用,并给自己带来简单调试的好处,通过copio语句打印某些内容到LogCat。您可以获得有关将调试信息打印到LogCat here和MediaPlayer文档的更多信息,其中哪些语句会引发哪个异常here。
HTH,
Sriram。
该问题已经被回答,只是对Sriram的建议进行错误检查。
启动针对soundpool错误的新线程以使其更清晰。
FC的堆栈跟踪会很有用,但它已经非常清晰,您应该使用SoundPool而不是15个独立的MediaPlayers。 – 2011-02-01 15:41:47
还描述了导致它崩溃的情况......它是否在启动时死掉,是否运行几分钟然后崩溃,它会在失败之前播放一定数量的声音吗? – 2011-02-01 15:47:12