在Android中使用Timer,并创建一个应用程序
16lz
2021-12-04
都知道java中有一个Timer:java.util.Timer;
Android中也可使用。下面来看看源代码:
public class TimerActivity extends Activity {long k = 0;long wait = 0;long length = 0;boolean isstart = false;MediaPlayer mp;Timer timer; EditText txtWait; EditText txtLength; Button btnStart; Handler HANDLER = new Handler() { @Override public void handleMessage(Message msg) { Bundle bundle=msg.getData(); switch(bundle.getInt("timer")) { case 0x0000001: Stop(); break; } super.handleMessage(msg); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txtWait = (EditText) findViewById(R.id.txtWait); wait = Integer.parseInt(txtWait.getText().toString()); txtLength = (EditText) findViewById(R.id.txtLength); length = Integer.parseInt(txtLength.getText().toString()); btnStart = (Button) findViewById(R.id.btnStart); mp = MediaPlayer.create(this, R.raw.alarm);timer = new Timer(); btnStart.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(!isstart) {Start();} else {isstart = false; k = 0;//省略Stop();timer.cancel();}}}); } void Start(){timer.purge();timer = new Timer();timer.schedule(new MyTask(), wait*1000, 1000);isstart = true;//省略 } void Stop(){//省略 } class MyTask extends TimerTask {@Overridepublic void run() {if(k==wait*1000) {//省略}if(k==(wait+length)*1000) {isstart = false; k = 0;timer.cancel();Message msg = HANDLER.obtainMessage();Bundle bundle = new Bundle();bundle.putInt("timer", 0x0000001);msg.setData(bundle);HANDLER.sendMessage(msg);timer.cancel();//省略}k+=1000;} }}
main.xml就不解释了。
首先在‘省略’里面写你自己的一些代码,
我在这里使用了Handler,原因待会揭晓。
Handler中处理了Message,然后处理了Message,注意,是在main线程中处理的。
onCreate方法里,我们为btnStart添加了onClickListener,处理Timer,点击以后,Timer开始执行,再点一次,Timer停止了。
然后在Start方法里,为timer设置了TimerTask:timer.schedule(new MyTask(), wait*1000, 1000); wait*1000是Timer等待时间,以毫秒为单位, 第二个1000是指Timer的执行周期,为1秒。
MyTask 中有一个run方法,是上面的每1秒执行一次,我们的程序是计时工具,在if(k==(wait+length)*1000)中,我们处理了timer.cencel()的一些事情,我们发送了一个Message给Activity线程中的Handler,是为了让Activity处理Timer结束的一些消息,比如修改Button的Text,只能在Activity中处理,否则会报错:跨线程的错误,由此我们可以得知,TiemrTask是在新的线程中执行的。
其实,我们可以单独使用Handler进行计时的操作:
Runnable r = new Runnable(){ public void run() { //刚才在TimerTask中的内容 HANDLER.postDelayed(r, 1000); }};HANDLER.postDelayed(r, 1000);//这与刚才的timer.schedule(new TimerTask(), wait, period)相似,wait我们可以在HANDLER第一次postDelayed中将Delayed设置为wait,再在Runnable中的HANDLER.postDelayed中设置Delayed为length.(wait与length的含义参考TimerActivity的源代码)这样,我们也可以实现Timer,并且在同一线程中。要是想在不同线程中,可以使用Timer。
要cencel这个HANDLER消息队列,我们在Runnable里的run方法中的HANDLER.postDelayed()加一个if就可以了
更多相关文章
- Android消息机制入门一
- 开机SD卡加载过程
- Android事件分发机制完全解析(终极版)
- Android图像处理之GPUImage for Android
- android TextView设置字过多长长度后面显示省略号失效
- 【Android休眠】之Android对PowerKey事件的处理(2)EventHub
- 详解Android(安卓)TextView属性ellipsize多行失效的解决思路
- Android(安卓)- 多线程 - AsyncTask
- Android解析WindowManagerService(一)WMS的诞生