在我改一个声音播放和录音的APP时,想让该APP使用Timer计时器自动每录5秒存储一次。
所以需要使用Timer计时器来完成。
但是我希望在使用该APP时能在APP界面内提示当前是第几次录音。
刚开始使用Toast.makeText();方法来显示字符串,但是程序运行时会出现异常终止。
在网上查了之后发现子线程中不能更新主界面的UI组件,要使用Handle来更新,但是网上很多Handle例子看起来很复杂。
最后找到了一种简单粗暴的方法来完成这个需求。
下面这段代码是我的整个TimerTask要做的所有事情:
主要更新TextView只有几行代码,该代码下面单独给出。
class myTaskStart extends TimerTask{
@Override
public void run(){
//开始录音
System.out.println("启动程序");
//count为一个全局变量,该全局变量来控制run的运行次数
if(count<33){
count=count+1;
}
else {
this.cancel();
System.exit(0);
}
//结束使用count控制run的运行次数
//开始更新TextView里面的字符串
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("start"+count);
}
});
//结束更新TextView里面的字符串
player.start();
String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
audioRecorder.createDefaultAudio(fileName); // status = Status.STATUS_READY;
audioRecorder.startRecord(null);
//等待录音
try {
Thread.sleep(5000);
}
catch (InterruptedException e)
{
Toast.makeText(getApplicationContext(),"异常",Toast.LENGTH_LONG).show();
}
//停止录音
System.out.println("停止录音啊啊啊啊");
audioRecorder.stopRecord();
player.stop();
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("end");
}
});
try {
player.prepare();
}
catch (IOException e)
{
System.out.println("player初始化失败!");
}
}
}
更新TextView的代码:
//开始更新TextView里面的字符串
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("start"+count);
}
});
//结束更新TextView里面的字符串