Frage

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?

War es hilfreich?

Lösung

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
        }  
    }
};

Andere Tipps

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top