(1)计时功能可以通过TimerTask来进行;
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=272433
(2)也可以通过Thread.sleep()来进行;
但是必须都得经过Handler发送消息来进行,为什么要配合Handler来进行呢?,根据google官方的技术文档:http://developer.android.com/guide/components/processes-and-threads.html,
在处理线程的时候有两条重要原则:
- Do not block the UI thread
- Do not access the Android UI toolkit from outside the UI thread
所以在任何任务内(无论TimerTask还是Runnable),都不能直接操控Android View(如:RecTime.setText("xxxx")),否则会抛出异常。
1.Thread.sleep(1000),采用这样的方法总是在按下“停止录音”按钮的时候,mHandler还是会多发送一次,不知道什么原因;
@Override
public void run() {
// TODO Auto-generated method stub
while(rFlag){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
++recordTime;
mHandler.sendEmptyMessage(TIMER_COUNTER);
Log.e("timer:", "send time");
}
}
2.最终我采用这样的方法。
timer = new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
//recTime.setText(parseTimer(++recordTime));
++recordTime;
mHandler.sendEmptyMessage(TIMER_COUNTER);
}
}, 1000, 1000);
这里有必要对Handler的使用,否则Eclipse总是提示内存会泄露,做一下代码示例(从网上找的):
private static class CustomHandler extends Handler{
WeakReference<MainActivity> mActivity;
public CustomHandler(MainActivity main){
mActivity = new WeakReference<MainActivity>(main);
}
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case TIMER_COUNTER:
MainActivity main = mActivity.get();
main.recTime.setText(main.parseTimer(main.recordTime));
break;
}
}
}
对java.util.Timer类的使用做一下说明:
是一种方便后台线程执行任务的东东,任务可以只执行一次,也可以重复执行。
几个重要的方法:
void schedule(TimerTask task,Date time):在指定的时间运行task这个任务
void schedule(TimerTask task,Date firstTime, long period):安排指定的任务在指定的时间开始进行重复的固定延迟执行。
void schedule(TimerTask task, long delay):安排在指定延迟后执行指定的任务。
void schedule(TimerTask task, long delay, long period):安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
void cancel():终止此计时器,丢弃所有当前已安排的任务。