Android Can';不能用处理程序处理

Android Can';不能用处理程序处理,android,seekbar,Android,Seekbar,我正在播放sd卡上的音乐,我希望我的seekbar在播放音乐时每2秒获得一次进度。我正试着和Handler一起做。但是我不知道如何正确地使用Handler 这是我的密码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seekBar1 =

我正在播放sd卡上的音乐,我希望我的seekbar在播放音乐时每2秒获得一次进度。我正试着和Handler一起做。但是我不知道如何正确地使用Handler 这是我的密码:

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


我的应用程序在我点击按钮2秒后崩溃1。所以我相信这里的问题是处理程序。我是否将此处理程序称为错误处理程序?当您询问应用程序崩溃时,请始终发布日志。 因此,在这种情况下,这里有NullPointerException,我认为: if(mediaPlayer.isPlaying()) 您没有初始化mediaplayer变量

编辑:

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

使用以下代码在2秒钟后更新SeekBar

在onCreate()中创建处理程序的对象,如下所示

Handler miHandler=new Handler()

在线程中添加并粘贴代码

miHandler.postDelayed(new Runnable() {
       @Override
   public void run() {
       try{
                 seekBar1.setProgress(mediaPos+ add 2sec delay time also);
          }catch(Exception e) {e.printStrackTrace();}
   }
}, 1500);

我看不到任何地方handler=newhandler();私有int mediaPos;私有int mediaMax;私有最终处理程序=新处理程序();哦,对不起,我以前有过这样的说法,所以我应该做MediaPlayer MediaPlayer=new MediaPlayer();不,我想您应该使用mediaPlayer对象,它是您在onClickListener中创建的。要实现此目的,请将MediaPlayer声明为类的字段。如果(MediaPlayer.isPlaying())是,请在之前声明MediaPlayer。如MediaPlayer mediaplyer=null?我用代码编辑我的答案。必须在类的任何方法之外声明它,并删除onClick方法内部的声明。