6.4.2 postDelayed方法和removeCallbacks方法的使用(1) – 51CTO.COM

方法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效果

 

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

  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的更新。

来源URL:http://book.51cto.com/art/201211/363310.htm