Android Can';不能用处理程序处理
我正在播放sd卡上的音乐,我希望我的seekbar在播放音乐时每2秒获得一次进度。我正试着和Handler一起做。但是我不知道如何正确地使用Handler 这是我的密码: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 =
@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方法内部的声明。