需要在Android应用程序中实现计时器(具有可变时间间隔的性质)

时间:2016-01-27 10:28:17

标签: android timer timertask

我编辑的代码。这个间隔是存储所需延迟的索引,索引初始化为0.我弄错了。这就是我一直在做的事情,

public class MainActivity{
private int index;
       //Some code and initializations

    public void startTimer{
     index=0;
    private Timer timer=new Timer();
    private TimerTask timertask=new MyTimerTask();
   // timer.schedule(timertask,0,1000);         //This line was causing trouble

    }

    private class MyTimerTask extends TimerTask
        {
                public void run() {     

           handler.postDelayed(new Runnable() {

        int limit = interval.size();

        @Override
        public void run() {
            if (index < limit) {
                Integer secondDelay = interval.get(k);
                Log.e(TAG, "index= " + index + " interval= " + secondDelay + " seconds");

                //Some code

                long delay = secondDelay * 1000;
                index++;
                handler.postDelayed(this, delay);
            } else {
                handler.removeCallbacksAndMessages(null); //Cancelling the handler.postDelayed
                Log.e(TAG, "Cancelling timer");
                timer.cancel();
            }
        }
    }, 0);
    }
}
}

日志输出是每1秒之后。

注释行导致错误。应该是 timer.schedule(TimerTask的,0);现在它正常工作。

3 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我用final Handler handler = new Handler(); handler.postDelayed(new Runnable() { int minute = 0; @Override public void run() { { Log.d("TAG", "next run after "+minute+" minutes"); long delay = minute * 60000; minute++; handler.postDelayed(this,delay); } } }, 0);

解决了
logcat

这是01-27 11:49:55.830 23761-23761/? D/TAG: next run after 0 minutes 01-27 11:49:55.945 23761-23761/? D/TAG: next run after 1 minutes 01-27 11:50:56.015 23761-23761/? D/TAG: next run after 2 minutes 01-27 11:52:56.115 23761-23761/? D/TAG: next run after 3 minutes 01-27 11:55:56.225 23761-23761/? D/TAG: next run after 4 minutes ...and so on

final ArrayList<Integer> interval = new ArrayList<>();
interval.add(1);
interval.add(5);
interval.add(10);
interval.add(3);

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    int index = 0;

    @Override
    public void run() {
        {

            if (index < interval.size()) {
                Integer secondDelay = interval.get(index);

                Log.d("TAG", "next run after " + secondDelay + " seconds");
                long delay = secondDelay * 1000;
                index++;
                handler.postDelayed(this, delay);
            } else {
                Log.d("TAG", "I finish");
            }

        }
    }
}, 0);

我的例子有一定的间隔时间,但您可以轻松地将其调整为秒。

希望它有所帮助。

EDIT 我根据您的评论修改了示例

01-27 17:51:09.940 28113-28113/? D/TAG: next run after 1 seconds
01-27 17:51:10.940 28113-28113/? D/TAG: next run after 5 seconds
01-27 17:51:15.950 28113-28113/? D/TAG: next run after 10 seconds
01-27 17:51:25.960 28113-28113/? D/TAG: next run after 3 seconds
01-27 17:51:28.965 28113-28113/? D/TAG: I finish

logcat的:

thirdPartyClass

答案 1 :(得分:0)

忘记Timer:在循环中使用sleep进行此操作会更容易:

class MyTimerRunnable implements Runnable {
  @Override public void run() {
    for (int i = 1; i < 5; ++i) {
      try {
        Thread.sleep(/* for however long */);
      } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new RuntimeException(e);
      }
      System.out.println("Current:"+new Date());
    }
  }
}

然后在自己的Thread(例如new Thread(new MyTimerRunnable()).start();)中开始,或者将其提交给Executor

答案 2 :(得分:0)

我使用Handler类(android.os包中的类)创建了自己的计时器类。这是一个基本概念。

您的类包含Handler类型的字段。您在构造函数中实例化它。您还应该有一个名为interval的字段。

在构造函数中,在创建处理程序对象之后,在处理程序上调用postDelayed。该方法需要两个参数。第一个是Runnable,第二个是ms的延迟。

要编写可运行的对象,请记住在执行完所需的操作后再次使用完全相同的参数调用处理程序postDelay

对于第二个参数,只需传递字段interval

tl;博士:你知道我在这做什么吗?构建计时器时,您会发布一段时间后将要发生的事件。当事件发生时,做你喜欢的事情并发布将在同一时间发生的另一个事件。

要更改间隔,只需添加一个setter即可设置interval对象。并且下次runnable运行时,它将在新的间隔后发布一个事件!

以下是我的计时器类的代码:

import android.os.Handler;

public class Timer {
    private Handler handler;
    private boolean paused;

    private int interval;

    private Runnable task = new Runnable () {
        @Override
        public void run() {
            if (!paused) {
                runnable.run ();
                Timer.this.handler.postDelayed (this, interval);
            }
        }
    };

    private Runnable runnable;

    public int getInterval() {
        return interval;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }

    public void startTimer () {
        paused = false;
        handler.postDelayed (task, interval);
    }

    public void stopTimer () {
        paused = true;
    }

    public Timer (Runnable runnable, int interval, boolean started) {
        handler = new Handler ();
        this.runnable = runnable;
        this.interval = interval;
        if (started)
            startTimer ();
    }
}
编辑:在审核了你的问题后,似乎你没有使用android,但你标记了android的问题。无论如何,如果你真的没有,只需使用更好的javax.swing.Timer。在Google上查找文档!