簡體   English   中英

停止和啟動計時器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM