[英]Stop and start timer
對不起我的英語不好。 我有計時器,如果我單擊計時器,我會發出魔杖,如果我再次單擊,則計時器關閉。 但是我的計時器只有一次。 如果我再次單擊(關閉計時器),則會出現如下異常:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException: Timer was canceled
at java.util.Timer.scheduleImpl(Timer.java:561)
at java.util.Timer.schedule(Timer.java:481)
at installation.ConnectDevice.callAsynchronousTask(ConnectDevice.java:211)
at installation.ConnectDevice$1.onClick(ConnectDevice.java:153)
at android.view.View.performClick(View.java:4240)
...
我不知道為什么它不起作用,請幫助。 在我班下
我的課
private Timer timer;
int time = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.i_connect_device);
timer = new Timer();
// my botton
includeDevice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (time < 1) {
callAsynchronousTask();
time++;
}
if (time > 0) {
stopTimer();
time--;
}
}
});
}
public void callAsynchronousTask() {
final Handler handler = new Handler();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
Log.e("Timer is work", "Timer is work");
// GetMsgs performBackgroundTask = new GetMsgs();
// PerformBackgroundTask this class is the class
// that extends AsynchTask
// performBackgroundTask.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 1000 * 10); // execute in every
// 50000 ms
}
public void stopTimer() {
timer.cancel();
}
如下更改onClick邏輯(因為在您的情況下,第一次僅執行callAsynchronousTask()和stopTimer()。因此在下一次onClick時引發異常)
btnTimer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (time == 0) {
callAsynchronousTask();
time = 1;
} else {
stopTimer();
time = 0;
}
}
});
和doAsynchronousTask使其成為字段,並在stopTimer()上取消任務。
public void stopTimer() {
doAsynchronousTask.cancel();
}
然后就可以了
從Javadocs:
cancel():終止此計時器,放棄任何當前計划的任務。 [...]計時器終止后,其執行線程將正常終止,並且無法在其上安排更多任務。
和
時間表(任務任務,長時間延遲)
拋出:
IllegalStateException-如果任務已被調度或取消,計時器被取消或計時器線程終止。
因此,基本上,您的類告訴您,由於計時器已取消,它無法完成設置任務。 您可以嘗試使計時器進入睡眠狀態,直到再次按下該按鈕,而不是完全取消它。
一旦取消計時器; 您無法再次啟動它,因為線程已停止。
看到鏈接:
暫停計時器,然后繼續
您必須以某種方式維護狀態並使用當前值重新創建計時器
您需要一個異步任務,它是一個類,因此您可以對其進行擴展。 公共類callAsynchronousTask擴展了異步任務,並且GetMsgs performBackgroundTask = new GetMsgs(); // PerformBackgroundTask此類是擴展Async Taskbar的類,它在后台方法中執行
如下所示在callAsynchronousTask中初始化您的計時器對象。
public void callAsynchronousTask(){final Handler handler = new Handler();
TimerTask doAsynchronousTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
Log.e("Timer is work", "Timer is work");
//GetMsgs performBackgroundTask = new GetMsgs();
// PerformBackgroundTask this class is the class that extends AsynchTask
//performBackgroundTask.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer=new Timer();
timer.schedule(doAsynchronousTask, 0, 1000*10); //execute in every 50000 ms
}
還要修改in塊,因為它同時執行兩個if條件。
使用布爾標志而不是int
boolean isTimerRunning;
if (!isTimerRunning) {
callAsynchronousTask();
isTimerRunning=true;
}
else (isTimerRunning) {
stopTimer();
isTimerRunning=false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.