2013-05-02 3 views
0

Я создал программу, которая неоднократно называют медиаплеера каждый метод OnTick на CountdownTimerMedia Player (-19,0) на CountdownTimer

Media Player Class

public class Buzzer extends Activity{ 
private MediaPlayer mp; 
private AssetFileDescriptor descriptor; 
private Context context; 

public Buzzer(Context context){ 
    super(); 
    this.context=context; 

} 
public void playBeep(){ 
    play("beep.mp3"); 
} 


public void stop(){ 
    if (mp.isPlaying()) { 
     mp.stop(); 
     mp.release(); 
    } 
} 

private void play(String file){ 

    try { 
     mp = new MediaPlayer(); 
     if (mp.isPlaying()) { 
      mp.stop(); 
      mp.release(); 
      mp.reset(); 
      mp = new MediaPlayer(); 
     } 

     descriptor= context.getAssets().openFd("audios/"+file); 
     mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 
     mp.prepare(); 
     mp.start(); 

    } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
    } catch (IllegalStateException e) { 
       e.printStackTrace(); 
    } catch (IOException e) { 
       e.printStackTrace(); 
    } 

} 
public void onResume(){ 
    super.onResume(); 
} 

public void onDestroy(){ 
    mp.stop(); 
    mp.release(); 
    super.onDestroy(); 
} 
} 

// Основная деятельность

 public class Main extends Activity { 
     Timer timer; 
     Buzzer buzzer; 


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


       buzzer=new Buzzer(Main.this); 
       timer=new Timer(24000,1000); 
       timer.start(); 

      } 

    public class Timer extends CountDownTimer{ 

     public ShotClock_CountdownTimer(long millisInFuture, long countDownInterval) { 
      super(millisInFuture, countDownInterval); 
     } 
     public void onTick (long millisUntilFinished) { 

     buzzer.playBeep(); 
     } 
     public void onFinish() { 
     } 

     } 
    } 

ответ

1

вы должны освободить медиаплеера перед вызовом playBeep everytime.You необходимо освободить() медиа-игроки в противном случае ресурсы не будут освобождены, и вы скоро выйти из мем ory.

+0

Он уже сделал это, если вы смогли проверить его метод stop() и другое место. – Kanth

0
public class Buzzer extends Activity{ 
private MediaPlayer mp; 
private AssetFileDescriptor descriptor; 
private Context context; 

public Buzzer(Context context){ 
    super(); 
    this.context=context; 
    mp = MediaPlayer.create(this,R.raw.beep); 
} 
public void playBeep(){ 
    if(mp!=null){ 
     mp.pause(); 
     mp.seekTo(0); 
     mp.start(); 
    } 
} 


public void stop(){ 
    if (mp.isPlaying()) { 
     mp.pause() 
    } 
} 


public void onResume(){ 
    super.onResume(); 
    playBeep(); 
} 

public void onDestroy(){ 
    super.onDestroy(); 
    stop(); 
} 
} 
+0

что ты делаешь? вы приостанавливаете медиаплеер в 'playBeep()' и 'stop()'. то что они будут делать? –

+0

достаточно одного экземпляра медиаплеера ... нет необходимости создавать его каждый раз ... becaz у вас есть только один экземпляр зуммера –

+0

пробовал этот код. ?? –

0

Изменение:

mp = new MediaPlayer(); 
if (mp.isPlaying()) { 
    mp.stop(); 
    mp.release(); 
    mp.reset(); 
    mp = new MediaPlayer(); 
} 

к:

if(mp != null){ 
    if(mp.isPlaying()){ 
     mp.stop(); 
    } 
    mp.release(); 
}else{ 
    mp = new MediaPlayer(); 
} 

Эта ошибка происходит потому, что ваш MediaPlayer находится в плохом состоянии. Основываясь на вашем текущем коде, вы создаете новый MediaPlayer прямо перед тем, как проверить, что он играет. Также вы снимаете только mp, если он играет. Вы должны выпустить его каждый раз.