用线程实现定时器功能

最近在写一个秒表,发现android自带的chronometer不太准,所以自己写了个定时器,用线程来实现,其中遇到了不少问题,最后还是实现了。

要使用线程Thread必须实现Runnable,并且要用handler来处理线程发来的消息


import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;


public class MyTimer {
private int mHour = 0;
private int mMinute = 0;
private int mSecond = 0;
private int mMillions = 0;
private boolean THREAD_CONTINUE = true;
private long millisA;// 第一次获得系统时间
private long millis;// 系统时间差
private long delt;// 暂停时,经过的时间差

/*

*处理线程发来的消息,每10毫秒保存一次时间差

/*
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
millis = System.currentTimeMillis() - millisA;
}
}
};


public long getMillis() {
return millis;
}


public int getmHour() {
mHour = (int) (millis / 3600000);
return mHour;
}


public void setmHour(int mHour) {
this.mHour = mHour;
}


public int getmMinute() {
mMinute = (int) ((millis / 60000) % 60);
return mMinute;
}


public void setmMinute(int mMinute) {
this.mMinute = mMinute;
}


public int getmSecond() {
mSecond = (int) ((millis / 1000) % 60);
return mSecond;
}


public void setmSecond(int mSecond) {
this.mSecond = mSecond;
}


public int getmMillions() {
mMillions = (int) (millis % 1000);
return mMillions;
}


public void setmMillions(int mMillions) {
this.mMillions = mMillions;
}


public MyTimer() {
// TODO Auto-generated constructor stub
}


/**
* 开始计时
*/
public void startCount() {
THREAD_CONTINUE = true;


// 计算时间
millisA = System.currentTimeMillis();


mRunnable runnable = new mRunnable();
Thread mThread1 = new Thread(runnable);
mThread1.start();
}


/**
* 当按下stop时,如果再按下start,则继续计时
*/


public void continueCount() {
THREAD_CONTINUE = true;


mRunnable runnable = new mRunnable();
Thread mThread2 = new Thread(runnable);
mThread2.start();


millisA = System.currentTimeMillis() - delt;// 此时,millisA是一个时刻,重新计时的时刻
}


/**
* 暂停计时
*/
public void pauseCount() {


delt = System.currentTimeMillis() - millisA;// 从第一次start到stop经过的时间差,为continueCount准备;


THREAD_CONTINUE = false;
}


/**
* 停止计时,清空时间

* @author Gao

*/
public void stopCount() {


THREAD_CONTINUE = false;


mHour = 0;
mMinute = 0;
mSecond = 0;
mMillions = 0;
millis = 0;
}


public class mRunnable implements Runnable {


@Override
public void run() {
// TODO Auto-generated method stub
while (THREAD_CONTINUE) {
try {
Thread.sleep(1);
Message message = Message.obtain();
message.what = 1;
mHandler.sendMessage(message);
// }
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值