1

スタートボタンを押してサービスを実行しています。サービスでは、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 に進みます

4

1 に答える 1

1

20秒ごとに上記のループを実行しています。

そしてループでは、2秒ごとに30回ルーチンを実行しています。

したがって、ループの実行には30x2秒かかります。(60秒)

最初のループの20秒後に、新しいループを開始します。

したがって、作成から20秒で次のようになります。

Loop 1 20/60 seconds complete.
Loop 2 0/60 seconds complete.

したがって、2秒ごとに2doMyWork()回実行されます。

40秒後、次のようになります。

Loop 1 40/60 seconds complete.
Loop 2 20/60 seconds complete.
Loop 3 0/60 seconds complete.

したがって、2秒ごとにdoMyWork()3回実行されます。

等々。

最後の質問に関しては、Runnableに破棄時に停止するように指示する必要があります。したがって、Runnableにアクセスできるように、これを行うにはグローバル変数が必要になります。

于 2013-01-20T20:31:35.637 に答える