首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

TimerTask代码示范[学习]

2012-07-26 
TimerTask代码示例[学习]TimerTask理解为一个定时任务,必须使用Handler更新UI,代码示例:?package com.test

TimerTask代码示例[学习]

TimerTask理解为一个定时任务,必须使用Handler更新UI,代码示例:

?

package com.test.activity;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.MotionEvent;import com.test.R;public class TestTimer extends Activity {    private static final int DOTIMERSUCCESS = 0;private static final String TAG = "TestTimer";private Timer timer;private MyTask myTask;@Override    public void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.main);         timer = new Timer(); }@Overridepublic boolean onTouchEvent(MotionEvent event) {setTitle("hello world...");if(myTask != null){//将原任务从队列中移除myTask.cancel();}myTask = new MyTask();// 新建一个任务timer.schedule(myTask, 4000);return super.onTouchEvent(event);}//主要负责更新UI?private  Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubif(msg.what == DOTIMERSUCCESS){setTitle("计时器已经启动...");Log.i(TAG, Thread.currentThread().getName());//main}super.handleMessage(msg);}};      //计时器任务   class MyTask extends TimerTask {  public void run() {               //Message message = new Message();                   //message.what = DOTIMERSUCCESS;                   //handler.sendMessage(message);             Log.i(TAG, Thread.currentThread().getName());  //Timer-0//或者使用sendToTarget代替sendMessage:            Message message = handler.obtainMessage(DOTIMERSUCCESS);            message.sendToTarget();        }      }  }

? 实现效果是当滑动屏幕时,设置Title为hello world... 4秒后Title变为计时器已经启动...,再洗滑动屏幕Title又变为hello world...,如此反复。要注意每次执行定时任务的时候要先判断上次的任务执行完没有,如果没有则需要先取消上次的任务,然后再开启新任务。从打印的Log上可以看出定时任务并不是运行在主线程之上,和AsyncTask类似。

?

补充:

AsyncTask也存在取消任务的方法, 执行AsyncTask.cancel()后,任务还是执行了(执行了dobackground方法),只是没有返回结果罢了(未执行onPostExecute)。

?

?

Mesage.sendToTarget(); 会将message传给创建它的handler然后,调用handleMessage去处理。

handler.sendMessage(Message) 也是把message穿给handler的handlMessage去处理。

两种方法都差不多。

?

创建Message对象尽量使用Handler.obtainMessage()从消息池中拿现成的,而不要使用new Message()实例化新的Message对象,增加系统开销。

?

热点排行