转自:http://www.cnblogs.com/xzf158/archive/2009/09/04/1560042.html

用Java一般写法,结果发现计时器根本不能运行,但却不报任何错误,当时就呆在那了,不知道该怎么办了,后来在网上查了一下,Android考虑到线程安全问题,不允许在线程中执行UI线程(我的现在所知道,还有其他的限制发现中),在 Android中,有一个很有意思的类:android.os.Handler,这个可以实现各处线程间的消息传递。
先看段代码,这个实例化了一个Handler,Handler可以通过Message在多个线程通讯,我这里做的是定时recLen加1,然后以一定的格式,显示到recTime上(UI线程上的操作)。


1finalHandlerhandler=newHandler(){
2publicvoidhandleMessage(Messagemsg){
3switch(msg.what){
4case1:
5recLen++;
6recTime.setText(GetRecTime(recLen));
7break;
8}
9super.handleMessage(msg);
10}
11};


下面定实例化一个TimerTask,这个是为Timer提供一个定时执行的内容。我在这个方法中加的是给Handler一个发送消息功能,因这在Timer的线程中,无法直接操作UI线程。

1 TimerTasktask = new TimerTask(){
2 public void run(){
3 Messagemessage = new Message();
4 message.what = 1 ;
5 handler.sendMessage(message);
6 }
7 };


剩下的工作就简单多,添加一个Timer,可以让程序运行起来了

1 timer = new Timer( true );
2 timer.schedule(task, 1000 , 1000 ); // 延时1000ms后执行,1000ms执行一次
3 // timer.cancel(); // 退出计时器


说到这里,也许有些还感觉云里雾里,好久没写东西,也不知道怎么把问题说的更明白,这个再贴上我开始的错误写法,对比错误写法,也许能让大家更快的明白过来


1TimerTasktask=newTimerTask(){
2publicvoidrun(){
3recLen++;
4recTime.setText(GetRecTime(recLen));//直接在TimerTask中操作UI线程,单步调试的时候发现,程序根本就没执行到这里
5}

6}
;
7timer=newTimer(true);
8timer.schedule(task,1000,1000);


更多相关文章

  1. Android(安卓)中的AsyncTask的使用心得
  2. Android开发易错点总结
  3. Android中AsyncTask的简单用法
  4. Android(安卓)ANR 分析(转载)
  5. Android之MessageQueue、Looper、Handler与消息循环
  6. 第四章 Android开发三大基石—Activity、Service和Handler(7)
  7. Android面试题(五)—— Android的消息机制
  8. X86 Android与ARM Android在应用上的兼容
  9. Android(安卓)消息机制

随机推荐

  1. Android调试问题集锦
  2. Android WebView 使用漏洞
  3. Android当中的线程使用
  4. 一个快速开发APP的框架:AndroidQuick
  5. Android美化EditText
  6. Android的Camera架构介绍 (转)
  7. SE for Android 系列之整体概要(三)
  8. Android面试题收集
  9. Broadcast
  10. Android 样式开发(二)selector篇