先理清概念:
Timer是一个执行任务的类,他接受TimerTask的参数;
Timer执行任务有两种方式,一种是在某个指定的时候执行某个任务timer.schedule(Timertask task,Data data),另一种是在多长时间之后执行某个任务timer.schedule(TimerTask task,long delay);
TimerTask中执行指定的任务,但由于Android是线程安全的,所有的界面的更新都必须放到主线程中,所以要使用到Handler对象。
Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。
而Runnable是一个接口,Thread是Runnable的子类。
下面是两种方法的例子
1 package com.example.test007; 2 3 import java.util.Timer; 4 import java.util.TimerTask; 5 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.os.Handler; 9 import android.os.Message; 10 import android.os.SystemClock; 11 import android.widget.TextView; 12 13 public class MainActivity extends Activity { 14 15 private TextView tv; 16 private int time=0; 17 18 private final Timer timer=new Timer(); 19 Handler handler=new Handler(){ 20 @Override 21 public void handleMessage(Message msg){ 22 ++time; 23 if(msg.what == 1){ 24 tv.setText("Handler,Timer以及TimeTask结合的方法: "+ time); 25 } 26 super.handleMessage(msg); 27 } 28 }; 29 30 //初始化计时器任务 31 TimerTask task =new TimerTask() { 32 @Override 33 public void run() { 34 //由于主线程安全,页面的更新需放到主线程中 35 Message msg =new Message(); 36 msg.what=1; 37 handler.sendMessage(msg); 38 } 39 }; 40 @Override 41 public void onCreate(Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 setContentView(R.layout.activity_main); 44 tv = (TextView) findViewById(R.id.tv1); 45 //隔1s执行一次 46 timer.schedule(task, 1000, 1000); 47 } 48 }
1 package com.example.test007; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.widget.TextView; 7 8 public class TimeActivity extends Activity { 9 private TextView tv; 10 private int time=0; 11 12 private Handler handler = new Handler(); 13 private Runnable runnable = new Runnable() { 14 @Override 15 public void run() { 16 ++time; 17 tv.setText("Handler的postDelayed(Runnable, long)方法 : "+ time); 18 handler.postDelayed(this, 1000); 19 } 20 }; 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.test); 25 tv = (TextView) findViewById(R.id.tv); 26 handler.postDelayed(runnable, 1000); 27 28 } 29 30 }