2013-05-02 72 views
0

我創建了一個程序,它被反覆調用媒體播放器每onTick方法上CountdownTimerMedia Player錯誤(-19,0)

媒體播放器類

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需要釋放()的媒體播放器,否則資源沒有被釋放之前釋放的媒體播放器,你很快就會出來的MEM奧伊。

+0

他已經完成了它,如果你可以檢查出他的stop()方法和其他地方。 – Kanth 2013-05-02 04:54:27

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()'中暫停媒體播放器。那麼他們會做什麼? – 2013-05-02 05:05:42

+0

媒體播放器的一個實例就足夠了......不需要每次創建它... becaz你只有一個蜂鳴器實例 – 2013-05-02 07:48:30

+0

你試過這個代碼嗎? – 2013-05-03 17:13:21

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。你需要每次釋放它。