Reputation: 219
I am playing music form my sd card and i want my seekbar to getprogress every 2 sec when music is playing. I am trying to do it with Handler. But i dont know how to use Handler coretly Here is my code:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar1 = (SeekBar) findViewById(R.id.seekBar1);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
textView1 = (TextView) findViewById(R.id.textView1);
button1.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(Environment.getExternalStorageDirectory()+"/MyImages/.audio2.wav");
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setupHandler();
}
});
}
private void setupHandler()
{
handler.removeCallbacks(moveSeekBarThread);
handler.postDelayed(moveSeekBarThread, 2000); //cal the thread after millisec
}
private Runnable moveSeekBarThread = new Runnable() {
public void run() {
if(mediaPlayer.isPlaying()){
int mediaPos = mediaPlayer.getCurrentPosition();
int mediaMax = mediaPlayer.getDuration();
seekBar1.setMax(mediaMax);
seekBar1.setProgress(mediaPos);
handler.postDelayed(this, 2000); //Looping the thread after second
// seconds
}
}
};
}
My app crashing 2 second after i clikc the button1. So i am sure the problem here is Handler. Do i call this handler wrong or something?
Upvotes: 0
Views: 249
Reputation: 633
Use The below code to Update the SeekBar after 2Seconds.
Create the Object for Handler inside your onCreate() like the following one.
Handler miHandler=new Handler();
add Paste the code inside your thread.
miHandler.postDelayed(new Runnable() {
@Override
public void run() {
try{
seekBar1.setProgress(mediaPos+ add 2sec delay time also);
}catch(Exception e) {e.printStrackTrace();}
}
}, 1500);
Upvotes: 0
Reputation: 1800
Post your logcat always when you ask about app crashes. Therefor in this case you have NullPointerException here, i think: if(mediaPlayer.isPlaying()) You doesn't initialize your mediaplayer variable.
EDITED:
MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
seekBar1 = (SeekBar) findViewById(R.id.seekBar1);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
textView1 = (TextView) findViewById(R.id.textView1);
button1.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(Environment.getExternalStorageDirectory()+"/MyImages/.audio2.wav");
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setupHandler();
}
});
}
private void setupHandler()
{
handler.removeCallbacks(moveSeekBarThread);
handler.postDelayed(moveSeekBarThread, 2000); //cal the thread after millisec
}
private Runnable moveSeekBarThread = new Runnable() {
public void run() {
if(mediaPlayer.isPlaying()){
int mediaPos = mediaPlayer.getCurrentPosition();
int mediaMax = mediaPlayer.getDuration();
seekBar1.setMax(mediaMax);
seekBar1.setProgress(mediaPos);
handler.postDelayed(this, 2000); //Looping the thread after second
// seconds
}
}
};
Upvotes: 2