我正在尝试使用计时器来安排应用程序中的重复事件.但是,我希望能够实时调整事件触发的时间段(根据用户输入).
例如:
public class HelperTimer extends TimerTask
{
private Timer timer;
//Default of 15 second between updates
private int secondsToDelay = 15;
public void setPeriod(int seconds)
{
this.secondsToDelay = seconds;
long delay = 1000; // 1 second
long period = 1000*secondsToDelay; // seconds
if (timer != null)
{
timer.cancel();
}
System.out.println(timer);
timer = new Timer();
System.out.println(timer);
timer.schedule(this, delay, period);
}
public int getPeriod()
{
return this.secondsToDelay;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我启动这个类的新实例并调用它的set period函数.但是,当我这样做时,我得到一个非法状态异常.你可以看到System.out.println(计时器); 在那里,因为我正在检查,并且确实,他们是两个不同的计时器...所以当我尝试在一个全新的Timer实例上运行计划调用时,为什么我会收到IllegalStateException!?!?!?!
java.util.Timer@c55e36
java.util.Timer@9664a1
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Task already …Run Code Online (Sandbox Code Playgroud) 我编写了一个连接到服务器的应用程序,并向他发送ping命令,服务器用pong命令回答.
我想实现连接超时机制.我想它将遵循:
另外,我想优化内存.所以,每次发送ping命令时都不要重新创建TimerTask .我尝试下面的代码:
private final Timer mSystemLogoutTimer = new Timer();
private final TimerTask mLogoutTask = new TimerTask() {
@Override
public void run() {
mMessageInterface.onConnectionTimeout();
cancel();
}
};
private void ping() {
sendRequest(RequestBuilder.formPing());
mSystemLogoutTimer.schedule(mLogoutTask, CoreConst.PING_ANSWER_DELAY);
}
private void onPong() {
mLogoutTask.cancel();
}
Run Code Online (Sandbox Code Playgroud)
但是当我第二次尝试安排TimerTask时出现以下错误:
java.lang.IllegalStateException: TimerTask is scheduled already
at java.util.Timer.scheduleImpl(Timer.java:572)
at java.util.Timer.schedule(Timer.java:459)
Run Code Online (Sandbox Code Playgroud)
我不明白,因为我打电话cancel()给TimerTask.
请告诉我我做错了什么.谢谢你的回答!
我有一个片段,其中包含一个图像按钮,通过计时器和其他4个链接到其他片段的按钮,定期更改图像.当我按下任何按钮时,它会跳转到该特定片段,但在按下后退按钮时,应用程序会崩溃.我试过timer.cancel但它没用.这是片段的代码:
public class Main2Activity extends Fragment {
View v;
Timer timer;
ImageView iv;
int i=0;
Integer[] imagechange = {
R.drawable.capture1,R.drawable.capture2,R.drawable.capture,R.drawable.capture
};
String[] linkstop = new String[]{"http://www.webmd.com/","http://www.drugs.com/","http://www.cancer.gov/","http://www.nlm.nih.gov/medlineplus/"};
ListView lv;
TimerTask updateTask = new TimerTask() {
@Override
public void run() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() { // TODO Auto-generated method stub
iv.setImageResource(imagechange[i]);
i++;
if (i > 3) {
i = 0;
}
}
});
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
v=inflater.inflate(R.layout.activity_main2,container,false);
//lv=(ListView)v.findViewById(R.id.list); …Run Code Online (Sandbox Code Playgroud)