先理清概念:
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 }