需要在android应用程序中实现计时器(具有可变时间间隔的性质)
我编辑的代码。这里的间隔是存储所需延迟的向量,索引初始化为0。我搞错了。这就是我一直在做的需要在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
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