`
yxwang0615
  • 浏览: 551747 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

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(); 
	}
	@Override
	public 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(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			if(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对象,增加系统开销。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics