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

需要在android应用程序中实现计时器(具有可变时间间隔的性质),android,timer,timertask,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 MyT

我编辑的代码。这里的间隔是存储所需延迟的向量,索引初始化为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);
    }
}
}
公共类活动{
私有整数索引;
//一些代码和初始化
公共空间起始点{
指数=0;
专用计时器=新计时器();
私有TimerTask TimerTask=新的MyTimerTask();
//timer.schedule(timertask,01000);//此行造成了问题
}
私有类MyTimerTask扩展了TimerTask
{
public void run(){
handler.postDelayed(新的Runnable(){
int limit=interval.size();
@凌驾
公开募捐{
if(指数<极限){
整数secondDelay=interval.get(k);
Log.e(标记“index=“+index+”interval=“+secondDelay+”seconds”);
//一些代码
长延时=秒延时*1000;
索引++;
handler.postDelayed(这个,delay);
}否则{
handler.removeCallbacksAndMessages(null);//取消handler.postDelayed
Log.e(标签“取消计时器”);
timer.cancel();
}
}
}, 0);
}
}
}
日志输出每1秒一次

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

忘记
Timer
:只需使用循环中的睡眠就可以更轻松地完成这项工作:

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());
    }
  }
}
类MyTimerRunnable实现可运行{
@重写公共无效运行(){
对于(int i=1;i<5;++i){
试一试{
线程。睡眠(/*不管多长时间*/);
}捕捉(中断异常e){
Thread.currentThread().interrupt();
抛出新的运行时异常(e);
}
System.out.println(“当前:+新日期());
}
}
}

然后在自己的
线程
(例如
新线程(new mytimerrunable()).start();
)中启动它,或者通过将它提交给
执行器
我使用
处理程序
类(android.os包中的类)创建了自己的计时器类。这里是它的一个基本概念

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

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

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

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

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

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

下面是我的timer类的代码:

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
更好。在谷歌上查找文档

我有一个类似的问题,我用
处理程序解决了这个问题

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);

这篇文章的标题是“android”,所以看起来用户使用android,但他不知道Handler类的存在,不管怎样,这个类很棒!那么你是说handler.postdayed中的“delay”应该包含所需的可变时间间隔?是的,它会自动递增调用匿名runnable的每一项根据你的建议,我使用delay=interval.get(k)*1000;handler.postDelayed(这个,delay);其中interval是一个由可变延迟组成的向量,k是索引,但如果我使用它,那么无论interval[k]的值如何,输出总是相差1秒。我使用arraylist用另一个示例更新答案感谢您的快速响应。但它仍然不起作用等等,您有点困惑,索引和k未声明,您不需要删除回调e…计时器。取消!??!请从我回答的代码开始。我发现了错误并已更正。谢谢,你帮了我很大的忙
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