1

ネストされた TimerTasks を使用したテスト コードがあります。つまり、1 つのタスクが 10 秒ごとに呼び出されてパラメーターを変更し、100 ミリ秒ごとにいくつかの計算を実行する別のタイマーを開始します。最初のタイマーでキャンセルを呼び出すと、外側の TimerTask がキャンセルされますが、内側のタイマーは実行され続けます。

内部タスクも停止するにはどうすればよいですか? 次のコードでは、外側のタスクは停止しますが、cancel() オーバーライドは呼び出されないことに注意してください。

    class CalcTask extends TimerTask
        {
            // randomly changes calc interval every time it is called
            public void run(){ 
                if (mTmr != null)
                    mTmr.cancel();
                mTmr = null;

                TimerTask calcTask = new TimerTask(){ public void run(){ Log.i("TempSensor","chad"); doCalcs(); } };

                int min = Integer.parseInt(mEditThreadMin.getText().toString());
                int max = Integer.parseInt(mEditThreadMax.getText().toString());
                int interval = mRand.nextInt(max-min)+min + 1;
                mTmr = new Timer(true);
                mTmr.schedule(calcTask,0,interval);
            } 

            @Override
            public boolean cancel()
            {
                Log.i("TempSensor","Cancelling");
                if(mTmr != null)
                {
                    mTmr.cancel();
                    mTmr.purge();
                }

                return super.cancel();
            }

            private Random mRand = new Random();
            private Timer mTmr = null;
        };

... // later on 
mTimerCalc1.scheduleAtFixedRate(new CalcTask(), 0, (int)10e3);
4

0 に答える 0