スタートボタンを押してサービスを実行しています。サービスでは、db から電話番号を取得するメイン スレッドが実行されます。データを取得した後、さまざまな時間間隔でいくつかのタスクを実行する必要があります。そのために、20 秒の一時停止後に実行されるスケジュールを使用します。その一時停止中に、2 秒の一時停止後にdoMyWork() (関数)を呼び出しています。
私が直面している問題は、20 秒のスケジュールがサイクルを完了すると、doMyWork()関数が 2 回、3 回呼び出されることです....などです。次に、サービスをアクティビティから停止すると、OnDestroyメソッドはサービスと MainThread を停止しますが、ループが 30 回実行されるまで停止しませんでした。
コードは
@Override
public void onCreate() {
super.onCreate();
// The service is being created
myThread.run();
}
private Runnable MainThread = new Runnable() {
public void run() {
try {
Cursor c = db.getNumbers(); // DB operation
scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
// This schedule a runnable task every 20 seconds
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
public void run() {
for (int i = 0; i < 30; i++) {
Thread.sleep(2000); // Wait 2 Seconds
Log.v(TAG, " wait" + i );
doMyWork(); // perform this operation
}// for
}
}, 0, 20 , TimeUnit.SECONDS);
} catch (Exception e) {
// TODO: handle exception
}
}
};
Thread myThread = new Thread( MainThread);
@Override
public void onDestroy() {
super.onDestroy();
Log.v(TAG, "onDestroy()");
scheduleTaskExecutor.shutdown();
myThread.stop();
}
スレッドで複数のタイマーを連続して使用する方法を教えてください。
編集
私がやりたかったことは、ループ コードを実行することです。ループに 20 回の繰り返しがあり、各サイクル ループでdoMyWork()を実行する前に 2 秒間待機するとします。scheduleTaskExecutor タイマーは可変値であり、固定値ではありません。10秒の値を与えるとしましょう。次に、for ループで doMyWork() 関数を実行し、2 秒間停止します。
これは、ループ実行 (i= 1,2,..5) の場合、5 回の scheduleTaskExecutor (5 x 2 = 10) が 10 秒間停止する必要があることを意味します。
待機後、(i = 6,7,...10) 反復からループを実行する必要があります。
反復:
scheduleTaskExecutor Step 0
run
{
loop i = 0 till 20 Step 1
wait 2 seconds Step 2
doMyWork() Step 3
loop i = 1
wait 2 seconds
doMyWork()
loop i = 2
wait 2 seconds
doMyWork()
loop i = 3
wait 2 seconds
doMyWork()
loop i = 4
wait 2 seconds
doMyWork()
loop i = 5
wait 5 seconds
doMyWork()
}
scheduleTaskExecutor Wait 10 ステップ 4
手順 4 の後 再び手順 1 に進みます