方法postDelayed的作用是延迟多少毫秒后开始运行,而removeCallbacks方法是删除指定的Runnable对象,使线程对象停止运行。

方法声明如下:

  1. public final boolean postDelayed (Runnable r, long delayMillis)

其中参数Runnable r在Handler对象所运行的线程中执行。

创建名称为handler2的Android项目,Main.java的核心代码如下:

  1. public class Main extends Activity {  

  2.    private Button button1;  

  3.    private Button button2;  

  4.    private Handler handler = new Handler();  

  5.    private int count = 0;  

  6.    private Runnable runnableRef = new Runnable() {  

  7.        public void run() {  

  8.            Log.v("2", Thread.currentThread().getName());  

  9.            count++;  

  10.            Log.v("!", "count=" + count);  

  11.            handler.postDelayed(runnableRef, 1000);  

  12.        }  

  13.    };  

  14.    @Override  

  15.    public void onCreate(Bundle savedInstanceState) {  

  16.        super.onCreate(savedInstanceState);  

  17.        setContentView(R.layout.main);  

  18.        Log.v("1", Thread.currentThread().getName());  

  19.        button1 = (Button) this.findViewById(R.id.button1);  

  20.        button2 = (Button) this.findViewById(R.id.button2);  

  21.        button1.setOnClickListener(new OnClickListener() {  

  22.            public void onClick(View arg0) {  

  23.                Thread thread = new Thread(runnableRef);  

  24.                thread.start();  

  25.                Log.v("!!!!!!!!!!!!!", "end");  

  26.            }  

  27.        });  

  28.        button2.setOnClickListener(new OnClickListener() {  

  29.            public void onClick(View arg0) {  

  30.                handler.removeCallbacks(runnableRef);  

  31.            }  

  32.        });  

  33.    }  

  34. }  

 

程序运行后单击button1按钮开始循环,count累加1,运行结果如图6.41所示。

图6.41 循环加1效果

6.4.2 postDelayed方法和removeCallbacks方法的使用(2)

从打印结果可以发现,使用代码:

  1. handler.postDelayed(runnableRef, 1000)

上述代码运行的Runnable并没有新建一个线程,而是运行在main线程里。

当单击button2按钮时,停止这种累加1的功能。

关于循环执行某一个任务还可以使用Java SE自带的类来进行处理,新建名称为TimerTest项目,文件Main.java的代码如下:

  1. public class Main extends Activity {  

  2.    private int count = 0;  

  3.    @Override  

  4.    public void onCreate(Bundle savedInstanceState) {  

  5.        super.onCreate(savedInstanceState);  

  6.        setContentView(R.layout.main);  

  7.        TimerTask task = new TimerTask() {  

  8.            @Override  

  9.            public void run() {  

  10.                Log.v("!", "" + (++count));  

  11.            }  

  12.        };  

  13.        Timer timer = new Timer();  

  14.        timer.schedule(task, 1000, 1000);  

  15.    }  

  16. }  

 

打印的效果如图6.42所示。

图6.42 Timer循环执行某一任务

如果想在TimerTask中控制View控件,还需要用Handler对象以发送消息Message的方式来处理View的更新。