识别列表中创建的计时器

时间:2014-09-30 15:00:00

标签: java android timer

如果我按以下方式创建计时器列表:

timers = new ArrayList<Timer>();

for(int i = 0; i<10;i++)
{
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {

                //Task of timer here                    


                }
            }, 0, 1000);

        timers.add(timer);
}

如何在run()方法中识别列表项是什么?

如果我这样做,则不起作用,因为我将设置最后一个计时器的所有id:

timers = new ArrayList<Timer>();

for(int i = 0; i<10;i++)
{
        final int timerId = i;
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

             @Override
             public void run() {

                //Task of timer here    
                 int id = timerId;


                    }
                }, 0, 1000);

        timers.add(timer);
}

4 个答案:

答案 0 :(得分:2)

可以使用不同的数据结构。 IE:Hashmap,将密钥(在您的情况下,ID)链接到Timer对象。

Timer对象也可以在构造函数中接受String

来自javadoc:

  

创建一个新的计时器,其关联的线程具有指定的名称。

然后,您将在runnable中的Thread上执行getName()方法:

Thread.currentThread().getName();

答案 1 :(得分:1)

您可以扩展TimerTask并实施您正在寻找的功能

class MyTimerTask extends TimerTask{
    private int timerId;
    public MyTimerTask(int timerId){
        this.timerId = timerId;
    }
    @Override
    public void run() {}
}
...
timers = new ArrayList<Timer>();

for(int i = 0; i<10;i++)
{
        final int timerId = i;
        Timer timer = new Timer();
        timer.schedule(new MyTimerTask(timerId), 0, 1000);

        timers.add(timer);
}

答案 2 :(得分:1)

final List<Timer> timers = new ArrayList<Timer>();

for(int i = 0; i<10;i++) {            
    final Timer timer = new Timer();
    timer.schedule(new TimerTask() {

         @Override
         public void run() {

             //Task of timer here    
             int id = timers.indexOf(timer);


         }
    }, 0, 1000);    
    timers.add(timer);
}

也很好,因为对于更多的计时器来说,更快的是HashMap / HashTable:

final Map<Integer, Timer> timers = new Hashtable<Integer, Timer>();

for(int i = 0; i<1000;i++) {            
    final Timer timer = new Timer();
    timer.schedule(new TimerTask() {

         @Override
         public void run() {

             //Task of timer here    
             int id = timer.hashCode();
             Timer t = timers.get(id);

         }
    }, 0, 1000);    
    timers.add(timer.hashCode(), timer);
}

答案 3 :(得分:1)

创建自定义计时器任务,可以管理与计时器任务相对应的ID。

public class MyTimerTask extends TimerTask {

int id;
public MyTimerTask(int  id) {
    this.id = id;

}


@Override
public void run() {
System.out.println("Running task id:"+id);
}

}

然后

timers = new ArrayList<Timer>();
for(int i = 0; i<10;i++)
{
        Timer timer = new Timer();
        timer.schedule(new MyTimerTask(i),0, 1000);

        timers.add(timer);
}

希望这会有所帮助。