带延迟的TimerTask / Handler被多次调用

时间:2015-10-18 07:52:55

标签: android timer android-handler

我需要延迟大约5秒钟。我尝试使用以下代码使用Timer:

            Timer myTimer = new Timer();
                myTimer.schedule(new TimerTask() {
                    @Override
                    public void run() {

                      Log.d(TAG,"Timer");
                    }

                }, 4000, 5000);

当我检查日志时,计时器打印三次。如果我改变时间,有时也会以日志4次打印。

我尝试过使用Handler,如下所示:

   final Handler mHandler = new Handler();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        while (true) {
                            try {
                                Thread.sleep(10000);
                                mHandler.post(new Runnable() {

                                    @Override
                                    public void run() {
                                        // TODO Auto-generated method stub

                                            Log.d(Utility.TAG,"Sleep::");

                                    }
                                });
                            } catch (Exception e) {
                                // TODO: handle exception
                            }
                        }
                    }
                }).start();

但是,日志多次打印。我只是想多次调用我的方法。我怎样才能实现它?

修改

使用没有线程的处理程序,如下所示:

 final Handler h = new Handler();
               final int delay = 3000; //milliseconds

                h.postDelayed(new Runnable(){
                    public void run(){
                        //do something
                        h.postDelayed(this, delay);
                        Log.d(Utility.TAG,"Sleep ::");
                    }
                }, delay);

但同样,Log正在打印三次

1 个答案:

答案 0 :(得分:0)

您的第三种方法(无Timer,无Thread)最接近正确。它多次打印,因为Runnable每次运行都会重新发布。如果您只想运行一次,请从run()方法中删除此行:

h.postDelayed(this, delay);