2015-01-16 6 views
-1

Im используя MediaPlayer для воспроизведения звука каждый раз, когда второй Гаснет это мой код:Media Player перестает работать после многократного использования

// Define CountDown Timer Attributes// 
       waitTimer1 = new CountDownTimer(60000, 1000) { 

        @Override 
        public void onTick(long millisUntilFinished) { 
         long timeLeft = millisUntilFinished/1000; 
         Timer.setText("" + String.format("%d min, %d sec", 
           TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished), 
           TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - 
             TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); 

         if (timeLeft >= 43) { 

          mp = MediaPlayer.create(getApplicationContext(), R.raw.beeb1); 
          mp.start(); 
         } 

        } 

После того, как таймер попадает 43 секунд MediaPlayer оборудовать барьерами, как ее предполагается.

после того, как я называю MediaPlayerrelease() так: (The Button нажимается каждый раз, так что я знаю, что это становится выпущен

 case R.id.Team1: 
      Category.team_one++; 
      number1.setText(String.valueOf(Category.team_one)); 
      t1.setEnabled(false); 
      t2.setEnabled(false); 
      next.setEnabled(true); 
      Timer.setText("1:00"); 
      mp.release(); 
     break; 

Проблема заключается после двух раз игры на тот же звук, это просто полностью перестает играть. Не знаю, почему. MediaPlayer будет воспроизводить звук только при первом запуске таймера. Во второй раз он дойдет до 45 секунд, а затем перестанет работать. В третий раз и так далее звук вообще не будет звучать. Пожалуйста, помогите, спасибо!

h прежде чем весь код:

 // Declare TextView Variable Number One// 
    protected TextView number1; 

// Declare TextView Variable Number Two// 
protected TextView number2; 

// Declare TextView Variable Timer// 
protected TextView Timer; 

// Declare TextView Variable Word// 
protected TextView word; 

// Declare Button Variable Next// 
protected Button next; 

// Declare CountDown Timer Variable// 
private CountDownTimer waitTimer1; 

// Declare Button Variable Team One// 
protected Button t1; 

// Declare Button Variable Team Two// 
protected Button t2; 

// Declare Media_Player Variable MP// 
MediaPlayer mp; 

// Where List Starts// 
int stringListCounter; 

// Shuffle List// 
@Override 
public void onResume() { 
    super.onResume(); 
    stringListCounter = randInt(0, 100); 
} 

// Shuffle List 
private int randInt(int min, int max) { 
    Random rand = new Random(); 
    int randomNum = rand.nextInt((max - min) + 1) + min; 

    return randomNum; 
} 

// What Happens When Activity Starts// 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_animals); 

    // Link Button Team One to Activity_Animals// 
    t1 = (Button) findViewById(R.id.Team1); 
    t1.setEnabled(false); 
    t1.setOnClickListener(this); 

    // Link Button Number One to Activity_Animals// 
    number1 = (TextView) findViewById(R.id.Number1); 
    number1.setText(String.valueOf(Category.team_one)); 

    // Link Button Number Two to Activity_Animals// 
    number2 = (TextView) findViewById(R.id.Number2); 
    number2.setText(String.valueOf(Category.team_two)); 

    // Link Button Team Two to Activity_Animals// 
    t2 = (Button) findViewById(R.id.Team2); 
    t2.setEnabled(false); 
    t2.setOnClickListener(this); 

    // Link TextView Timer to Activity_Animals// 
    Timer = (TextView) findViewById(R.id.Timer); 

    // Link Button Next to Activity_Animals// 
    next = (Button) findViewById(R.id.Next); 
    next.setOnClickListener(this); 

    // Link TextView Word to Activity_Animals// 
    word = (TextView) findViewById(R.id.Word); 
} 

// What Happens When Said Variable Is Clicked// 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 

     case R.id.Next: 
      t1.setEnabled(false); 
      t2.setEnabled(false); 
      next.setText("next"); 

      if (waitTimer1 == null) { 

       // Define CountDown Timer Attributes// 
       waitTimer1 = new CountDownTimer(60000, 1000) { 

        @Override 
        public void onTick(long millisUntilFinished) { 
         long timeLeft = millisUntilFinished/1000; 
         Timer.setText("" + String.format("%d min, %d sec", 
           TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished), 
           TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - 
             TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); 

         if (timeLeft >= 43) { 

          mp = MediaPlayer.create(getApplicationContext(), R.raw.beeb1); 
          mp.start(); 
         } 

        } 

        @Override 
        public void onFinish() { 

         t1.setEnabled(true); 
         next.setEnabled(false); 
         waitTimer1 = null; 
         Timer.setText("0:00"); 
         next.setText("Start"); 
        } 

       }.start(); 

       // Repeat Words// 
       if (word.getText().toString().equals("Big Foot")) { 

        stringListCounter = 0; 

       } 
       // Change To Next Word// 
       stringListCounter++; 
       word.setText(stringIdList[stringListCounter]); 

      } else{ 
       // Repeat Words// 
       if (word.getText().toString().equals("Big Foot")) { 

        stringListCounter = 0; 

       } 
       // Change To Next Word// 
       stringListCounter++; 
       word.setText(stringIdList[stringListCounter]); 
      } 
      break; 

     case R.id.Team1: 
      Category.team_one++; 
      number1.setText(String.valueOf(Category.team_one)); 
      t1.setEnabled(false); 
      t2.setEnabled(false); 
      next.setEnabled(true); 
      Timer.setText("1:00"); 
      mp.stop(); 
      mp.reset(); 
      mp.release(); 
     break; 

     case R.id.Team2: 
      Category.team_two++; 
      number2.setText(String.valueOf(Category.team_two)); 
      t1.setEnabled(false); 
      t2.setEnabled(false); 
      next.setEnabled(true); 
      Timer.setText("1:00"); 
      mp.release(); 
      mp = null; 
     break; 

    } 

    } 
} 
+0

напишите больше кода, пожалуйста ... вы, вероятно, не сбросили одну из своих переменных, как ожидалось. – Jim

+0

Я добавил весь код @jim – Jordan

+0

@ user2712869: после удаления 'timeLeft> = 43' условие поведения такое же? –

ответ

1

Проблема в этом коде:

   @Override 
       public void onTick(long millisUntilFinished) { 
        long timeLeft = millisUntilFinished/1000; 
        Timer.setText("" + String.format("%d min, %d sec", 
          TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished), 
          TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - 
            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)))); 

        if (timeLeft >= 43) { 

         mp = MediaPlayer.create(getApplicationContext(), R.raw.beeb1); 
         mp.start(); 
        } 

       } 

Прямо сейчас, на каждом «галочки» (1000 мс), он создает новый MediaPlayer и не начиная его до тех пор, обратный отсчет меньше 43, что означает, что вы начинаете 17 MediaPlayer с - и не выпускаете ни одного из них, кроме последнего. Поэтому вы, вероятно, вызываете проблемы с памятью с MediaPlayer

Поскольку вы используете повторяющийся звук, вы должны просто создать свой MediaPlayer в onCreate и на каждом тике сбросить/воспроизвести его. Вам не нужно повторно создавать/выпускать/и т. Д.

+0

. Вот и все! Спасибо, я пытался выяснить причину этого вопроса на некоторое время – Jordan

Смежные вопросы