MediaPlayer вызывает ошибку FC - PullRequest
       1

MediaPlayer вызывает ошибку FC

0 голосов
/ 01 февраля 2011

Хорошо, я получаю эту ошибку 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();
}

}

Ответы [ 3 ]

0 голосов
/ 01 февраля 2011

Вау!Почему вы используете так много объектов MediaPlayer?Почему бы не иметь один объект медиаплеера, а затем выделять ему ресурсы при нажатии этой кнопки?Я не знаю, что делает ваше приложение, но я написал бы приведенный выше код (или хотя бы его фрагмент) примерно так:

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 и дает вам преимущество простой отладки с помощью операторов copius, которые что-то печатают в LogCat.Вы можете получить больше информации о печати отладочной информации в LogCat здесь и документации MediaPlayer относительно того, какой оператор выдает исключение здесь .

HTH,
Шрирам.

0 голосов
/ 05 февраля 2011

На вопрос был дан ответ только при проверке ошибок по совету Шрирама.

Запуск нового потока для ошибки soundpool, чтобы сделать его более понятным.

0 голосов
/ 01 февраля 2011

Вы создаете слишком много объектов MediaPlayer, что может легко вызвать исключение. Вы также освобождаете их в методе onDestroy(), который во многих случаях вызываться не будет.

Измените свой код, чтобы использовать вместо него SoundPool.

...