计时器无法正常工作 android
Timer not working properly android
我有一个调用函数 beginMemoryQuest(View v)
的按钮。我期待 0-5 的数字计数,每个数字相差 1 秒。意思是,Handler
mHandler
应该从 0-5 接收 index
。但是,看起来 LogCat 正在打印它正在接收所有 index=6
调用。我该如何解决? 我希望 Handler
接收来自 0-6 的呼叫,每个呼叫的周期为一秒。
感谢任何帮助,非常感谢!
private static int index;
public void beginMemoryQuest(View v){
Timer t=new Timer();
for(index=0;index<6;index++){
t.schedule(new TimerTask() {
@Override
public void run() {
Bundle b=new Bundle();
b.putInt("index", index);
Message msg=new Message();
msg.setData(b);
mHandler.sendMessage(msg);
}
}, 1000*index+1);
}
}
public Handler mHandler=new Handler(){
public void handleMessage(Message msg){
int ind=msg.getData().getInt("index", -1);
Log.e("###","handling "+ind);
}
};
PS:Handler
有一个警告:This Handler class should be static or leaks might occur
第一个问题是您正在创建 6 个计时器任务,而不是仅仅重复相同的任务 6 次。其次,定时器任务在延迟后 运行 ,到那时你已经创建了所有 6 个定时器任务并且甚至在任务开始之前将索引值增加到 6。
尝试这样的事情:
private int index = 0;
public void beginMemoryQuest(View v){
final Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
Bundle b=new Bundle();
b.putInt("index", index);
Message msg=new Message();
msg.setData(b);
mHandler.sendMessage(msg);
index++;
if (index>=6) {
t.cancel();
}
}
}, 1000, 1000);
}
更新:
我在 schedule
方法中添加了第三个参数,它让计时器知道在指定延迟后再次安排它,直到我们取消计时器。
我有一个调用函数 beginMemoryQuest(View v)
的按钮。我期待 0-5 的数字计数,每个数字相差 1 秒。意思是,Handler
mHandler
应该从 0-5 接收 index
。但是,看起来 LogCat 正在打印它正在接收所有 index=6
调用。我该如何解决? 我希望 Handler
接收来自 0-6 的呼叫,每个呼叫的周期为一秒。
感谢任何帮助,非常感谢!
private static int index;
public void beginMemoryQuest(View v){
Timer t=new Timer();
for(index=0;index<6;index++){
t.schedule(new TimerTask() {
@Override
public void run() {
Bundle b=new Bundle();
b.putInt("index", index);
Message msg=new Message();
msg.setData(b);
mHandler.sendMessage(msg);
}
}, 1000*index+1);
}
}
public Handler mHandler=new Handler(){
public void handleMessage(Message msg){
int ind=msg.getData().getInt("index", -1);
Log.e("###","handling "+ind);
}
};
PS:Handler
有一个警告:This Handler class should be static or leaks might occur
第一个问题是您正在创建 6 个计时器任务,而不是仅仅重复相同的任务 6 次。其次,定时器任务在延迟后 运行 ,到那时你已经创建了所有 6 个定时器任务并且甚至在任务开始之前将索引值增加到 6。
尝试这样的事情:
private int index = 0;
public void beginMemoryQuest(View v){
final Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
Bundle b=new Bundle();
b.putInt("index", index);
Message msg=new Message();
msg.setData(b);
mHandler.sendMessage(msg);
index++;
if (index>=6) {
t.cancel();
}
}
}, 1000, 1000);
}
更新:
我在 schedule
方法中添加了第三个参数,它让计时器知道在指定延迟后再次安排它,直到我们取消计时器。